我是云托管的新手......
我正在开发一个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?
答案 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