如何在Heroku Cedar堆栈上使用.htaccess重定向到HTTPS

时间:2014-10-21 14:43:59

标签: .htaccess mod-rewrite ssl heroku load-balancing

我是云托管的新手......

我正在开发一个PHP Web应用程序,该应用程序作为“Cedar”应用程序在Heroku上托管。 Heroku为其所有子域提供“背负式”SSL,因此我可以正常加载https://myapp.herokuapp.com。但我也可以加载http://myapp.herokuapp.com。我想通过将http请求重定向到https来强制使用SSL。

通常,这很容易。我只需按如下方式使用mod_rewrite:

RewriteCond %{HTTPS} != on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

但这对HEROKU不起作用!

在流量到达我的应用之前,SSL似乎终止于上游。因此永远不会满足%{HTTPS}条件,结果是重定向循环。我也试过以下,但也没有用:

RewriteCond %{SERVER_PORT} != 443 #<--also redirect loop
RewriteCond %{REQUEST_SCHEME} !https #<--also redirect loop

所以我的问题是如何在上游终止时检测/重定向到HTTPS?

3 个答案:

答案 0 :(得分:44)

花了一整天的时间,我想出来了!!

该问题得到了有力的总结here

底线:Heroku设置自己的自定义标头以指示流量的ORIGINAL方案(在SSL在负载均衡器处终止之前)。

所以这适用于Heroku上的.htaccess文件

##Force SSL 

#Normal way (in case you need to deploy to NON-heroku)
RewriteCond %{HTTPS} !=on

#Heroku way
RewriteCond %{HTTP:X-Forwarded-Proto} !https 

#If neither above conditions are met, redirect to https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

秘密酱是HTTP:X-Forwarded-Proto的行。

希望这有助于其他人遇到同样的问题!在撰写本文时,有关于此的ZERO文档。

答案 1 :(得分:1)

我在上面给出的最佳答案中添加了一行,因此它不会破坏我没有配置SSL的本地开发环境:

# If header is present in the request
RewriteCond %{HTTP:X-Forwarded-Proto} .

(注意仅当all preceeding RewriteCond持有时才应用RewriteRule。

答案 2 :(得分:0)

如果heroku没有获取您的.htaccess文件,则可能必须使用heroku

记录的自定义应用程序级别的Apache配置。

基本上,您需要将其添加到您的个人资料中: web: vendor/bin/heroku-php-apache2 -C apache_app.conf