仅在Heroku上播放HTTPS的配置

时间:2018-08-26 11:47:20

标签: heroku https playframework

我四处搜寻并找到了与此主题相似的主题(例如herehere),但我似乎仍然无法正常工作,因此请按此处进行操作。

我正在使用play 2.6并部署到Heroku。我想强制该应用程序仅使用HTTPS。如前所述,this filter(具有正确的Heoku设置)似乎应该可以解决我的问题。但是我似乎无法正常工作。基本上,如果我执行简单的设置,我建议在下面将其重定向到https,如果尝试任何尝试,都会收到错误消息。

我想我要问的是如何设置Procfile,application.conf和Environment变量以部署到Heroku。作为FYI,我正在使用/我希望能够将play's self signed certificates用于非生产性部署,以防造成问题。

=====对于Procfile ====

通常,一个简单的Procfile可能看起来像:



    web: target/universal/stage/bin/my-app -Dhttp.port=${PORT}

但是如果没有heroku,我想做这样的事情(请参阅here



    play -Dhttp.port=disabled -Dhttps.port=443

由于Heroku会自动设置端口/ Http,因此如何合并这两个端口?即是否应该使用${HTTPS_PORT}这样的heroku env变量?

=====对于application.conf ====

大概我们想要这样的东西



    play.filters.enabled += play.filters.https.RedirectHttpsFilter
    play.filters.https.redirectEnabled = true

“不需要play.filters.https.redirectEnabled = true”,但我放在那里是为了以防万一。但是我还需要指定play.filters.https.port吗? (请参见here)。像这样:



    play.filters.enabled += play.filters.https.RedirectHttpsFilter
    play.filters.https.redirectEnabled = true
    play.filters.https.port=???


谢谢。

====编辑===

感谢@codefinger,您给出的答案是正确的。我将在下面放置详细信息以供将来参考。

here所述,您需要告诉play来检查请求是否已得到保护。在这种情况下,这实际上意味着将代理列入白名单。因此,Proc文件可以很简单:



    web: target/universal/stage/bin/my-app -Dhttp.port=${PORT}

但是您需要启用RedirectHttpsFilter并配置受信任的代理。请注意,这里我信任所有IP,但是根据您的应用,您可以对其进行限制(详细信息here)。



    play.filters.enabled += play.filters.https.RedirectHttpsFilter
    play.http.forwarded.trustedProxies=["0.0.0.0/0", "::/0"]

1 个答案:

答案 0 :(得分:0)

我认为您需要启用play.core.server.common.ForwardedHeaderHandler,它将检测到X-Forwarded-Proto header that Heroku sets

TLS终止由Heroku路由器处理,这意味着所有请求在到达您的应用程序时均使用纯HTTP。您的应用唯一知道它们是否为HTTP(S)的唯一方法是此标头。