.htaccess重定向循环由http - >产生https重写规则

时间:2014-10-21 12:42:31

标签: .htaccess mod-rewrite redirect ssl heroku

我们的代码在两个不同的服务器上运行。一个有https启用,另一个("遗产")没有。我们想强制https,但只能在SSL服务器上。

我添加了以下代码,但它导致了重定向循环。

#Force SSL for everyone but legacy production
RewriteCond %{HTTP_HOST} !legacy\.site\.com
RewriteCond %{HTTPS} !=on
#RewriteCond %{SERVER_PORT} !=443 #<--this also causes redirect loop
#RewriteCond %{REQUEST_SCHEME} != https #<--this causes a 500 error!
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

以下是以下内容(我不相信这很重要,但我完整地将其包括在内):

#gzip
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript


RewriteEngine on
RewriteCond $1 !^(index\.php|public|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

为什么?

更新服务器是Heroku Cedar应用程序,它使用&#34;背驮式&#34; SSL:https://blog.heroku.com/archives/2012/5/3/announcing_better_ssl_for_your_app

2 个答案:

答案 0 :(得分:2)

非常感谢@anubhava和@ arco444的深思熟虑的评论...

事实证明我遇到的重定向循环是因为SSL终止了Heroku Cedar堆栈应用程序的上游。这意味着流量的最后一段是从不https,所以正常的技术将永远重定向=重定向循环。

解决此问题的方法(在Heroku上)是为其特殊自定义标头X-Forwarded-Proto添加RewriteCond。所以这有效:

##Force SSL for everyone but legacy production
RewriteCond %{HTTP_HOST} !legacy\.site\.com 
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

答案 1 :(得分:1)

您的服务器可能未设置HTTPS变量。尝试使用SERVER_PORT

RewriteCond %{HTTP_HOST} !^legacy\.site\.com$
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]