我四处搜寻并找到了与此主题相似的主题(例如here和here),但我似乎仍然无法正常工作,因此请按此处进行操作。
我正在使用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"]
答案 0 :(得分:0)
我认为您需要启用play.core.server.common.ForwardedHeaderHandler
,它将检测到X-Forwarded-Proto
header that Heroku sets。
TLS终止由Heroku路由器处理,这意味着所有请求在到达您的应用程序时均使用纯HTTP。您的应用唯一知道它们是否为HTTP(S)的唯一方法是此标头。