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

das*_*ash 23 .htaccess mod-rewrite https redirect 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>
Run Code Online (Sandbox Code Playgroud)

这是我的首选代码.至少现在是unil.

替代方式

我还发现了很多其他方法可以重定向HTTPHTTPS.例如:

1.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)

错过了一步?不,[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]
Run Code Online (Sandbox Code Playgroud)

不同的订单一般更好吗?

我应该用吗?

RewriteRule ^(.*)$
Run Code Online (Sandbox Code Playgroud)

代替

RewriteRule (.*)
Run Code Online (Sandbox Code Playgroud)

3.

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
Run Code Online (Sandbox Code Playgroud)

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

所以,我的问题都是专家:什么是最好的(表演)的方式无论从重定向HTTPHTTPS to HTTPS://

nlu*_*nlu 27

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

你可以通过使用来缩短它

RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)

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

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

关于RewriteRule自身的匹配部分,您应该保持一致:如果要捕获部分URI,您将使用带括号的正则表达式.事实上,你实际上在这里使用它只是使用"任何"的替代品之一,^并在%{REQUEST_URI}以后使用.如果你使用一些捕获(即(some_regex)你应该在目标中通过使用$1(或者你要引用的任何东西)在这里引用它).

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

您可以检查https是否已关闭,或者域名是否在一个规则中包含前导"www",但重写条件与"和"隐式关联.

所以它应该是:

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

NE是将GET参数之类的东西传递给新URI不变的必要条件,请参阅:

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


Roe*_*aar 6

所以,冷凝,这变成了;

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

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