最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)

Posted

技术标签:

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

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

这是我想做的事

http://domain.tld/ → https://domain.tld/ http://www.domain.tld/ → https://domain.tld/ https://www.domain.tld/ → https://domain.tld/

最佳实践 .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:// 的最佳(执行)方式是什么?

【问题讨论】:

【参考方案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 有趣!你能引用参考/来源吗? ***.com/a/18959763/989468 @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]

只需复制粘贴即可。

【讨论】:

以上是关于最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .htaccess 正确地将 HTTP 301 重定向到 HTTPS?

使用 301 或 303 将 http 重定向到 https

如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点

301 将 HTTP 重定向到 HTTPS - 非 www 到 www

text 将301 HTTP重定向到HTTPS

Htaccess 301将规则/ HTTP重定向到HTTPS /非www到www