htaccess重定向到https:// www
我有以下htaccess代码:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
我希望我的网站被重定向到https://www.
与HTTPS,并执行www.
子域,但是当我访问http://www.
(没有HTTPS),它不会将我重定向到使用HTTPS的https://www
。
要首先强制执行HTTPS,必须先检查正确的环境变量%{HTTPS} off
,但上面的规则会预先设置www.
由于您有第二个规则来执行www.
,不要在第一条规则中使用它。
RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
关于代理
当某些代理形式(客户端通过HTTPS连接到代理,负载均衡器,Passenger应用程序等)进行连接时, %{HTTPS}
变量可能永远不会on
并导致重写循环。 这是因为即使客户端和代理/负载均衡器正在使用HTTPS,您的应用程序实际上仍在接收纯HTTP流量。 在这些情况下,请检查X-Forwarded-Proto
标题而不是%{HTTPS}
变量。 这个答案显示了适当的过程
Michals的答案为我工作,虽然只有一个小小的修改:
问题:
当您拥有单个网站安全证书时 ,会尝试访问您的网页而不使用https:// www。 (或您的证书所覆盖的任何域名)将在其收到重定向到安全且正确的https页面之前显示一个丑陋的红色警告屏幕。
解
首先使用重定向到www(或者你的证书所涵盖的任何域),然后执行https重定向。 这将确保您的用户不会遇到任何错误,因为您的浏览器看到的证书不包含当前网址。
#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
如果您使用的是CloudFlare或类似的CDN,那么您将通过此处提供的%{HTTPS}解决方案获得无限循环错误。 如果你是CloudFlare用户,你需要使用这个:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
链接地址: http://www.djcxy.com/p/31173.html
上一篇: htaccess redirect to https://www
下一篇: How can I prevent access to PHP files if the caller isn't using HTTPS?