仅在 Heroku 上播放 HTTPS 的配置
Play configurations for HTTPS only on Heroku
我四处搜索并找到了与此接近的主题(例如 and here),但我似乎仍然无法正常工作,所以这里开始。
我正在使用 play 2.6 并部署到 Heroku。我想强制该应用仅使用 HTTPS。正如前面提到的 post 表示 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 自动设置了 port/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"]
我认为您需要启用 play.core.server.common.ForwardedHeaderHandler
,它将检测 X-Forwarded-Proto
header that Heroku sets。
TLS 终止由 Heroku 路由器处理,这意味着所有请求在到达您的应用程序时都是纯 HTTP 格式。您的应用判断它们是否为 HTTP(S) 的唯一方法是 header.
我四处搜索并找到了与此接近的主题(例如
我正在使用 play 2.6 并部署到 Heroku。我想强制该应用仅使用 HTTPS。正如前面提到的 post 表示 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 自动设置了 port/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"]
我认为您需要启用 play.core.server.common.ForwardedHeaderHandler
,它将检测 X-Forwarded-Proto
header that Heroku sets。
TLS 终止由 Heroku 路由器处理,这意味着所有请求在到达您的应用程序时都是纯 HTTP 格式。您的应用判断它们是否为 HTTP(S) 的唯一方法是 header.