【问题标题】:XForwardedSupport for https play! support on Heroku failingXForwardedSupport 支持 https 播放!支持 Heroku 失败
【发布时间】:2012-01-20 17:22:12
【问题描述】:

我正在 Heroku 上部署一个应用程序并尝试确定传入的请求是否安全 (request.secure)。这最初在 heroku 上返回 false,因为 nginx 处理 SSL 工作并通过纯 http 与应用服务器通信。因此,为了让 play 读取让我知道这是一个安全请求的标头,我添加了:

XForwardedSupport=127.0.0.1

按照播放留言板中的建议转到 application.conf。但是,所有请求(图像除外)都会失败且没有错误。在它到达播放日志之前,这似乎是一些根本性的事情。有人经历过吗?

【问题讨论】:

  • 我认为问题是因为 heroku 管理路由的方式。创建支持票,他们的回答非常迅速,我对他们解决问题的能力感到非常高兴。
  • 会的,我会以任何分辨率发回这里。

标签: heroku playframework mochiweb


【解决方案1】:

非常棒!您节省了数小时与 heroku+play 的斗争! 我可以确认,当您在 application.conf 中进行设置时

XForwardedSupport=all

heroku 不再抱怨 SIGTERM

【讨论】:

    【解决方案2】:

    正如@Dan Carley 票在https://play.lighthouseapp.com/projects/57987/tickets/1406-play-123-124-playmvcrouter-does-not-fully-support-proxied-ssl#ticket-1406-4 上指出的那样

    在 Heroku 上托管时,(正如 Mirko 指出的那样)在 application.conf 中设置 XForwardedSupport=all 有效。

    【讨论】:

      【解决方案3】:

      我认为 Play 不支持通过 XForwardedSupport 配置参数在 Heroku 上转发(代理)请求的方式。这需要设置为 Heroku 负载均衡器的地址,并且没有办法配置该预运行时。相反,您应该只查看x-forwarded-proto 请求标头来确定对Heorku 负载均衡器的请求是通过http 还是https。可能是这样的:

          Boolean secure = false;
          if (request.headers.get("x-forwarded-proto") != null) {
            secure = request.headers.get("x-forwarded-proto").values.contains("https");
          }
          System.out.println("secure = " + secure);
      

      顺便说一句:Heroku 的 cedar 堆栈不使用 Nginx。它使用MochiWeb,一个基于 Erlang 的 Web 服务器。

      【讨论】:

      • 这绝对是问题所在,正如 Heroku 支持工程师所证实的那样。我担心如果 play 不知道请求是安全的,那么它会做一些事情,比如默认执行重定向回非 ssl url 之类的事情。无论如何,我会尝试一下,看看还有什么问题并报告。谢谢!
      • 到目前为止,这个解决方案做得很好!对于某些带注释的处理程序,我强制重定向到 SSL,因此永远无法通过常规 http 查看操作。如果有人感兴趣,我会发布一些关于它是如何完成的代码,我们发现它非常有用(现在这个修复适用于 heroku)。
      • 我已经添加了一些想法,以使其在上游 Play 代码中更有用。我很想在这张票中听到更多人的消息:Play bug #1406
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2012-07-09
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多