如何在 Heroku Cedar 堆栈上使用 .htaccess 重定向到 HTTPS
Posted
技术标签:
【中文标题】如何在 Heroku Cedar 堆栈上使用 .htaccess 重定向到 HTTPS【英文标题】:How to redirect to HTTPS with .htaccess on Heroku Cedar stack 【发布时间】:2014-12-16 20:15:55 【问题描述】:我是云托管新手...
我正在开发一个作为“Cedar”应用程序托管在 Heroku 上的 php Web 应用程序。 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 时检测/重定向到 HTTPS?
【问题讨论】:
【参考方案1】:花了一整天的时间,我想通了!!
这个问题被雄辩地总结了here。
底线: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
一行。
希望这可以帮助遇到同样问题的其他人!在撰写本文时,关于此的文档为零。
【讨论】:
我希望我昨天能找到这个:( 这对我们帮助很大。谢谢SDP 在过去的三个小时里,我一直把头撞在墙上,试图弄清楚这一点。这解决了它。谢谢! 谢谢!像魅力一样工作。 记得在开头加上“RewriteEngine On”【参考方案2】:我在上面给出的最佳答案中添加了一行,因此它不会破坏我没有配置 SSL 的本地开发环境:
# If header is present in the request
RewriteCond %HTTP:X-Forwarded-Proto .
(注意 RewriteRule 仅在 all preceeding RewriteCond 持有时应用)。
【讨论】:
【参考方案3】:如果 heroku 没有获取您的 .htaccess 文件,您可能必须使用 heroku 记录的自定义应用程序级别 Apache 配置
基本上,您需要将其添加到您的个人资料中:
web: vendor/bin/heroku-php-apache2 -C apache_app.conf
【讨论】:
以上是关于如何在 Heroku Cedar 堆栈上使用 .htaccess 重定向到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章
Heroku cedar 堆栈上的 Node.js 端口问题
如何让一个简单的 php 应用程序从 heroku cedar 堆栈发送电子邮件?
从 Heroku Bamboo 堆栈升级到 Cedar 堆栈