Answers:
我找到了解决方案。
没有HSTS(单个重定向):
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]
使用HSTS(双重重定向):
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]
https://
重定向上进行双重重定向,尤其是在使用HSTS的情况下。这样,浏览器可以为您的域存储HSTS首选项,并且后续请求始终默认为https://
您的条件是隐式AND,并且第二个条件将始终为true(除非您具有其他域),因此您当前的规则将仅重定向非SSL流量。
您需要OR
条件并否定www
(第二个)条件:
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
如果SERVER_PORT
不是443(即不是HTTPS)或主机不以www.
(例如,您正在访问裸域)开头,则重定向到规范URL。
但是,这是否重定向https://example.com
到https://www.example.com
将取决于您的安全证书。(您的网站需要通过SSL的www和非www都可以访问,以触发.htaccess重定向。)
这将同时用于www或非www如果您尝试打开带有www的链接,则将网址重定向到带有www的https
示例:
http://domain.com
重定向到https://domain.com
或如果您尝试打开非www的链接,则将网址重定向到非www的https
示例:
http://www.domain.com
重定向到https://www.domain.com
RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
用RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [R=301,L]
http://example.com
(即HTTP和非www),因为它将首先重定向到同一主机上的HTTPS (即不带www
),然后重定向到www
第二个重定向。您可以通过简单地逆转这两个规则来纠正此问题。