htaccess重写 - 重定向太多

时间:2017-05-02 16:49:41

标签: apache .htaccess redirect mod-rewrite

我试图在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上。

可能导致此问题的原因是什么?

1 个答案:

答案 0 :(得分:8)

  

使用http://或 https:// 时,添加您指定的RewriteCondRewriteRule会给我?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]