我是云托管新手...
我正在开发一个PHP Web应用程序,它作为一个“Cedar”应用程序托管在Heroku上。Heroku为它们所有的子域提供“piggy back”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在上游终止时,我如何检测/重定向到HTTPS?
3条答案
按热度按时间3ks5zfa01#
在这上面花了一整天的时间,我想通了!!
这个问题在《专业Heroku编程》一书中得到了雄辩的总结。
底线:Heroku设置自己的自定义报头来指示流量的原始方案(在SSL在负载平衡器终止之前)。
所以这在Heroku上的. htaccess文件中工作
秘密调味汁是
HTTP:X-Forwarded-Proto
的线。希望这能帮助其他有同样问题的人!在写这篇文章的时候,关于这方面的文档为零。
s71maibg2#
我在上面给出的答案中添加了一行,这样就不会破坏我的本地开发环境,因为它没有配置SSL:
(Note仅当all preceeding RewriteCond保持时才应用重写规则)。
hpcdzsge3#
如果heroku没有获取.htaccess文件,您可能必须使用heroku提供的自定义应用程序级Apache配置
基本上,你需要将此添加到您的个人资料:
web: vendor/bin/heroku-php-apache2 -C apache_app.conf