【问题标题】:Best Practice: 301 Redirect HTTP to HTTPS (Standard Domain)最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)
【发布时间】:2015-05-15 17:55:58
【问题描述】:

我一直在寻找完美的 301 重定向。但是我找到了这么多解决方案,不知道什么是最好的。

这是我想做的事

最佳实践 .htacess?

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>

这是我的首选代码。至少到现在为止。

替代方法

我还发现了许多其他从HTTP 重定向到HTTPS 的方法。例如:

1.

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

少了一步?这里没有[R=301,L]

2.

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

Is a different order generally better?

我应该使用

RewriteRule ^(.*)$

而不是

RewriteRule (.*)

?

3.

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]

使用完整域名是否有任何性能优势?我真的需要NE吗? ([R=301,L,NE][L,R=301]

所以,我向所有专家提出的问题:从HTTP 重定向到HTTPS 和从 重定向到HTTPS:// 的最佳(执行)方式是什么?

【问题讨论】:

    标签: .htaccess mod-rewrite redirect https url-redirection


    【解决方案1】:

    从您最喜欢的解决方案开始:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
        RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
        RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
    </IfModule>
    

    在处理非 https URL 的部分中,您将重定向到 %{HTTP_HOST}。然后,如果您的主机名以“www”开头,则必须进行第二次重定向以将您从https://www.domain.tld 发送到应该是您的最终目的地的https://domain.tld

    您可以使用

    来缩短它
    RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301]
    

    直接在第一条规则中。然后,第二条规则将仅适用于尝试访问 https://www.domain.tld 的客户端。

    替代方案 1. 因同样的原因不起作用(缺少HTTP_HOST 可能是www.domain.tld 的情况),另外还因为缺少[L,R=301]。这是必要的,因为您不只是在此处重写 URL,就像您可以在其他类型的重写规则中那样。您正在请求客户端更改其请求的类型 - 这就是您向他发送301 的 HTTP 代码的原因。

    关于RewriteRule 本身的匹配部分,您应该保持一致:如果您想捕获部分URI,您将使用带括号的正则表达式。因为您实际上在这里将它作为一个整体使用,所以只需使用“任何东西”的替代品之一就可以了,比如^,然后再使用%{REQUEST_URI}如果您使用了一些捕获(即(some_regex),您应该在目标中使用$1(或您要引用的任何内容)在此处引用它。

    在您的第三种选择中,再次缺少 www + https。

    您可以检查https是否关闭如果域名在一个规则中包含前导“www”,但重写条件与“and”隐式连接。

    所以它应该是:

    RewriteCond %{HTTPS} off          [OR]
    RewriteCond %{HTTP_HOST} ^www\.   [NC]
    RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
    

    NE 对于将 GET 参数之类的东西传递给新的 URI 是必要的,请参阅:

    http://httpd.apache.org/docs/2.4/rewrite/flags.html

    【讨论】:

    • 非常感谢。我现在正在使用此代码: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ example.com/%{REQUEST_URI} [R=301,L,NE] RewriteCond %{HTTP_HOST} ^www \.(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L,NE]
    • 我知道这是一个稍微旧的答案,但不会从替代 3 返回 RewriteRule ^ https://domain.tld/%{REQUEST_URI} [R=301,L,NE],例如domain.tld//index.html 带双斜线?该行不应该只是读取RewriteRule ^ https://domain.tld/%{REQUEST_URI} [R=301,L,NE],而静态域文本和%{REQUEST_URI}之间没有斜线吗?
    • 以上代码不适用于 Network Solutions 托管的网站。它将产生一个无限循环。请参阅:networksolutions.com/support/ssl-redirects 这是一个糟糕的解决方案。我正在尝试寻找替代方案,但还没有。
    • @WebDude0482 这是网络解决方案特有的问题,不应在此解决。您链接到的networksolution 的文档简单地说,它们不允许服务器检测https。如果您无法检测到 https,则无法基于它进行重定向 - 是的,这很明显。我不明白应该如何基于此更改答案。
    • 我添加它是因为像我这样来这里寻找答案的人可能在 NS 上,他们不必浪费时间尝试上述方法。只是想帮忙。我敢肯定,我们都尝试过在某些情况下不起作用的代码,经过很多时间和挫折,找出困难的方法。
    【解决方案2】:

    所以,浓缩,这变成了;

    RewriteEngine On 
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC] 
    RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE] 
    

    如果您发现任何错误,请告诉我

    【讨论】:

    • 如果我们希望将example.com/path 重写为example.com/path,我们如何强制在所有URL 后面加上斜杠,例如对于WP 网站
    • L 标志不应该是 (L)ast 吗?它结束了标志的处理,所以 NE 将被忽略。
    • @Chiwda 有趣!你能引用参考/来源吗?
    • @Chiwda 谢谢。所以我想知道下面评论中@homesh-paul 的代码是如何工作的,例如它首先有L,然后是R=301
    【解决方案3】:
        RewriteEngine On   
        RewriteCond %{HTTPS} off
        RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
        RewriteCond %{HTTP_HOST} !^www\.
        RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    

    只需复制粘贴即可。

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多