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?