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

如何在Heroku Cedar堆栈上使用.htaccess重定向到HTTPS,.htaccess,mod-rewrite,ssl,heroku,load-balancing,.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_重写,如下所示: RewriteCond %{HTTPS} != on RewriteRule ^ https://%{H

我是云主机新手

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

通常,这很容易。我将使用mod_重写,如下所示:

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

RewriteCond%{SERVER\u PORT}!=花了一整天的时间在这上面,我终于明白了

对这个问题进行了雄辩的总结

一句话:Heroku设置自己的自定义头,以指示流量的原始方案(在负载平衡器终止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
的行


希望这能帮助其他有同样问题的人!在撰写本文时,没有关于这方面的文档。

我在上面给出的伟大答案中添加了一行,这样就不会破坏我没有配置SSL的本地开发环境:

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

(请注意,只有在RewriteCond处于保留状态时,才应用RewriteRule)。

如果heroku没有提取您的.htaccess文件,您可能必须使用自定义应用程序级Apache配置,如

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

我希望我昨天就发现了这一点:(这对我们帮助很大。感谢SDPBeen在过去的三个小时里用我的头撞在墙上试图弄明白这一点。这解决了它。谢谢!谢谢!工作得很有魅力。记得在开始添加“重写引擎”