【问题标题】:htaccess force https and redirect www to non-www, but no other subdomainshtaccess 强制 https 并将 www 重定向到非 www,但没有其他子域
【发布时间】:2014-02-23 09:29:46
【问题描述】:

我知道有很多类似的线程,但似乎没有一个符合我的确切问题。这是我想要做的:

(1) http://www.mydomain.com/ -> https://mydomain.com/
(2) http://mydomain.com/     -> https://mydomain.com/
(3) https://www.mydomain.com -> https://mydomain.com/

理想情况下,如果我将添加更多子域,我也想涵盖这种情况,以自动表现如下(最好以适用于我添加的任何子域的通用方式)。

(4) http://sub.mydomain.com/ -> https://sub.mydomain.com/

此时我想知道是否有可能创建一个 .htaccess 文件来完成我需要的一切,尽管我必须承认我了解正则表达式,但我并不完全是 mod_rewrite uberpro。

以下是我已经尝试过的解决方案:

我的 SSL 证书涵盖 www 子域,所以我不是在寻找“不受信任的连接”错误解决方案,我知道这是不可能的。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite https


    【解决方案1】:

    我发现当您有 https://www.example.com 并重定向到 https://example.com 的内容时,大多数建议都没有被采纳。

    以下适用于所有排列:

    RewriteEngine On
    
    # match any URL with www and rewrite it to https without the www
    RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
    RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]
    
    # match urls that are non https (without the www)
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} !^(www\.)(.*) [NC]
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    

    希望这对某人有所帮助!

    【讨论】:

    • 作为.htaccess 文件为我工作;但在虚拟主机配置文件下的<Directory> 块中使用时,仍然没有将https://www.example.com 重定向到https://example.com。知道如何适应这种情况吗?
    • 请忽略我最后的评论。我的重定向逻辑被letsencrypt(certbot)生成的另一个虚拟主机覆盖;当我将它们添加到我的 *:80*:443 虚拟主机下的 <Directory> 块时,您的重写规则对我有用。
    • 此解决方案处理将https://www.example.com 重写为https://example.com。我还必须将它包含在 *:80*:443 虚拟主机中才能使其正常工作。
    【解决方案2】:

    将此代码放入您的DOCUMENT_ROOT/.htaccess 文件中:

    RewriteEngine On
    
    RewriteCond %{HTTPS} off
    RewriteCond %{ENV:HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
    
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]
    

    【讨论】:

    • 虽然这似乎完成了将所有内容重定向到mydomain.com 的工作,但似乎正在进行的重定向太多了。详细地说,这是浏览器告诉我的 (1) 到 (3) 的内容,包括所需的重定向目标:Opera: 301 Moved Permanently。该文档已移至此处(链接到mydomain.com,导致相同的结果) Chromium:此网页有一个重定向循环 Firefox:该页面未正确重定向。 […] 以一种永远不会完成的方式。这可能是由重写规则中的 redirect=301 引起的吗?
    • 抱歉,我仍然遇到同样的问题。我希望这不是我做错并且不知道的其他事情(当然,在再次测试之前,我从浏览器中擦除了所有缓存的数据、cookie 等)。也许我会只强制使用 https 并将 www 子域作为互联网历史的剩余部分......也许它毕竟不是那么重要。不过,非常感谢您为我编写了一个不错的通用 htaccess 文件所做的努力,我很感激。
    • 是的,我刚刚尝试了一个带有一些新浏览器的全新虚拟机,绝对没有任何历史记录。仍然得到重定向循环:-(
    • 嗯……似乎比我想象的要难。我只有静态 HTML 文件用于在这个新的网络空间中进行测试,没有 CMS、CGI 脚本或使用 mod_rewrite 的东西,它们可能会干扰这个 .htaccess 中的规则。我现在在我的主机上打开了一张支持票,告诉他们我正在尝试做什么,并询问他们是否有任何可能妨碍我的全局配置。让我们看看他们怎么说!
    • 原来%{HTTPS} 是 mod_ssl 的一个功能,它没有在我的主机上运行。相反,他们使用磅作为 HTTPS 前端,它提供环境变量 %{ENV:HTTPS}。因此,我添加了一行来检查这一点,并将旧的留在其中以处理旧设置。我最终工作的 .htaccess 现在看起来像这样:RewriteEngine On RewriteCond %{HTTPS} !=on RewriteCond %{ENV:HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]
    【解决方案3】:

    强制使用 HTTPS

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    

    强制 www 为非 www

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.bewebdeveloper.com$
    RewriteRule ^(.*) http://bewebdeveloper.com/$1  [QSA,L,R=301]
    

    【讨论】:

      【解决方案4】:
      RewriteEngine on
      
      
      RewriteCond %{HTTPS} off [OR]
      RewriteCond %{HTTP_HOST} ^www\.([^.]+\.[^.]+)$ [NC]
      RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]
      

      此脚本将重定向

      同时保留子域。

      【讨论】:

        【解决方案5】:

        没有一个例子对我有用,它们似乎陷入了一个循环,但以下工作。

            # match any URL with www and rewrite it to https without the www
            RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
            RewriteRule (.*) https://%2%{REQUEST_URI} [R=301,L]
        
            # match non https and redirect to https
            RewriteCond %{HTTP:X-Forwarded-Proto} !https
            RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
        

        顺序很重要,在某些情况下会阻止第三次重定向。

        如果您想使用子域(除了 www.),只需删除第一个规则集。

        所以对于子域,你所需要的只是

            # match non https and redirect to https
            RewriteCond %{HTTP:X-Forwarded-Proto} !https
            RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
        

        我使用 Cloudways 服务,我发现这是唯一有效的方法

        【讨论】:

          【解决方案6】:

          我发现以下答案符合您的要求:

          www to non-www with https没有其他子域

          RewriteEngine on
          
          RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
          RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
          
          RewriteCond %{HTTPS} !on
          RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
          

          满足所有三 (3) 个条件:

          (1) http://www.example.com/ -> https://example.com/
          (2) http://example.com/     -> https://example.com/
          (3) https://www.example.com -> https://example.com/
          

          除了www之外没有其他子域,如下所示:

          (4) http://others.example.com -> https://others.example.com/
          (5) https://others.example.com -> https://others.example.com/
          

          【讨论】:

            【解决方案7】:

            只需将此代码添加到根 .htaccess 文件中

            RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
            RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
            

            【讨论】:

              猜你喜欢
              • 2016-09-05
              • 2017-01-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-19
              • 1970-01-01
              相关资源
              最近更新 更多