我试图在htaccess中强制使用非www https,但我发现的每个示例都会引发错误"重定向太多"
我想重定向:
http://www.example.com
http://example.com
https://www.example.com
为:
https://example.com
我找到的最佳解释解决方案如下:
https://simonecarletti.com/blog/2016/08/redirect-domain-http-https-www-apache/
...其中给出了以下示例:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
感谢您的解释,我理解它正在做什么,但我仍然得到同样的错误 - 重定向太多。
我能做的最好的事情是:
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
...但当然不会重定向http://example.com
。
我在httpd.conf
中没有重定向设置,在Plesk中没有设置。我在CentOS 6.8,Apache 2.2.15,Plesk 12.5上。
可能导致此问题的原因是什么?
答案 0 :(得分:8)
使用http://或 https:// 时,添加您指定的
RewriteCond
和RewriteRule
会给我?off_example.com
。这是预期的吗?
不,这不是预期的结果 - 这将是问题所在。通过HTTPS
访问时,on
应为https://...
。如果HTTPS
服务器变量永远不会设置为“on”(或者更确切地说,永远不会从“off”更改),那么RewriteRule
将导致重定向循环。
这表明“Plesk中的Let's加密插件”是通过某种“代理”(前端)服务器实现的吗?您的应用程序服务器仍然通过未加密的HTTP响应代理,并且客户端与代理的连接通过HTTPS加密。至少,这就是它的样子 - 但你的主人应该能够证实这一点。
如果是这种情况,则代理通常会设置其他HTTP请求标头,其中包含有关客户端连接的详细信息。您应该能够检查应用程序看到的请求标头,但通常使用正在使用的协议(“http”或“https”)设置X-Forwarded-Proto
标头。如果是这种情况,那么您可以将现有指令更改为以下内容:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]