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

eme*_*his 19 .htaccess mod-rewrite ssl load-balancing heroku

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

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

通常,这很容易.我只想使用mod_rewrite如下:

RewriteCond %{HTTPS} != on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)

但是这对HEROKU没有用!

看来SSL会在流量到达我的应用之前终止上游.因此%{HTTPS}从未满足条件,结果是重定向循环.我也试过以下,但也没有用:

RewriteCond %{SERVER_PORT} != 443 #<--also redirect loop
RewriteCond %{REQUEST_SCHEME} !https #<--also redirect loop
Run Code Online (Sandbox Code Playgroud)

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

eme*_*his 46

花了一整天的时间,我明白了!

这里雄辩地总结了这个问题.

底线: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]
Run Code Online (Sandbox Code Playgroud)

秘密酱是线HTTP:X-Forwarded-Proto.

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

  • 记得在开头添加"RewriteEngine On" (3认同)
  • 您介意共享整个 .htaccess 文件吗?我不确定将这段代码放在 .htaccess 中的确切位置。 (2认同)