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

时间:2015-03-13 09:43:15

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

我一直在寻找完美的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]

所以,我向所有专家提出的问题:从HTTPHTTPS以及从重定向到HTTPS://的最佳(表现)方式是什么? ?

3 个答案:

答案 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不变,请参阅:

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

答案 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]

只需复制并粘贴就可以更改。