我一直在寻找完美的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>
这是我首选的代码。至少现在是unil。
替代方式
我还发现了很多其他方法可以从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://
的最佳(表现)方式是什么? ?
答案 0 :(得分:26)
从您最喜欢的解决方案开始:
<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网址的部分中,您将重定向到%{HTTP_HOST}
。然后,如果您的主机名以&#34; www&#34;开头,则必须进行第二次重定向,以便将您从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。
如果域名包含领先的&#34; www&#34>,您可以检查https是否已关闭或但是,在一个规则中,重写条件与&#34;和&#34;隐式连接。
所以它应该是:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
NE必须将GET参数之类的东西传递给新的URI不变,请参阅:
答案 1 :(得分:3)
所以,冷凝,这就变成了;
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
如果您发现任何错误,请告诉我
答案 2 :(得分:1)
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]
只需复制并粘贴就可以更改。