最佳实践: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
【讨论】:
非常感谢。我现在正在使用此代码: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 站点