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.
替代方式
我还发现了很多其他方法可以重定向HTTP到HTTPS.例如:
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])
所以,我的问题都是专家:什么是最好的(表演)的方式无论从重定向HTTP到HTTPS和 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
所以,冷凝,这变成了;
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)
如果您发现任何错误,请告诉我