【问题标题】:Play configurations for HTTPS only on Heroku仅在 Heroku 上播放 HTTPS 配置
【发布时间】:2018-08-26 11:47:20
【问题描述】:

我四处搜索并找到了与此相关的主题(例如 herehere),但我似乎仍然无法使其正常工作,所以就这样吧。

我正在使用 play 2.6 并部署到 Heroku。我想强制应用只使用 HTTPS。正如前面提到的帖子所指出的那样,this filter(使用适当的 Heoku 设置)似乎应该可以解决我的问题。但我似乎无法让它工作。基本上,如果我进行下面我建议的简单设置,它不会重定向到 https,如果我尝试任何花哨的东西,我就会出错。

我想我要问的是如何设置 Procfile、application.conf 和环境变量以部署到 Heroku。作为一个仅供参考,我正在使用/我希望能够将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 自动设置了端口/Https,我该如何合并这两者?即我应该使用像${HTTPS_PORT} 这样的heroku env var吗?

===== 对于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"]

【问题讨论】:

    标签: heroku https playframework


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2017-11-03
      • 2012-01-20
      • 2012-01-16
      • 2017-11-07
      • 2018-05-31
      • 2019-09-05
      • 2014-04-18
      相关资源
      最近更新 更多