最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)
Best Practice: 301 Redirect HTTP to HTTPS (Standard Domain)
我一直在寻找完美的 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
以及从
重定向到 [= 的最佳(执行)方法是什么? 24=] ?
从您最喜欢的解决方案开始:
<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 to 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,您将使用带括号的正则表达式。由于您实际上在这里将它作为一个整体使用,因此可以只使用 "anything" 的替代方案之一,例如 ^
并稍后使用 %{REQUEST_URI}
。 如果您使用了一些捕获(即(some_regex)
您应该在此处使用</code>(或您要引用的任何内容)在目标中引用它。</p>
<p>在你的第三个备选方案中,www + https 也不见了。</p>
<p>您可以检查https是否关闭<em>或</em>如果域名在一条规则中包含前导"www",但是重写条件与[=55=隐式连接]. </p>
<p>所以它应该是:</p>
<pre><code>RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
NE 是将 GET 参数等传递给新 URI 的必要条件,请参阅:
所以,冷凝,这就变成了;
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
如果您发现任何错误,请告诉我
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://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
以及从 重定向到 [= 的最佳(执行)方法是什么? 24=] ?
从您最喜欢的解决方案开始:
<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 to 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,您将使用带括号的正则表达式。由于您实际上在这里将它作为一个整体使用,因此可以只使用 "anything" 的替代方案之一,例如 ^
并稍后使用 %{REQUEST_URI}
。 如果您使用了一些捕获(即(some_regex)
您应该在此处使用</code>(或您要引用的任何内容)在目标中引用它。</p>
<p>在你的第三个备选方案中,www + https 也不见了。</p>
<p>您可以检查https是否关闭<em>或</em>如果域名在一条规则中包含前导"www",但是重写条件与[=55=隐式连接]. </p>
<p>所以它应该是:</p>
<pre><code>RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
NE 是将 GET 参数等传递给新 URI 的必要条件,请参阅:
所以,冷凝,这就变成了;
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
如果您发现任何错误,请告诉我
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]
无需更改,只需复制和粘贴即可。