【问题标题】:Does Heroku strip incoming X-Forwarded-Proto header?Heroku 是否剥离传入的 X-Forwarded-Proto 标头?
【发布时间】:2015-12-31 19:10:38
【问题描述】:

我想要做什么

我有一个托管在 Heroku 上的网络应用程序,它使用 Django,域(比如)example.com。我想让所有传入的http://example.com 请求重定向到https://example.com

我做了什么

我在 Django 中设置了SecurityMiddleware,并将SECURE_SSL_REDIRECT 设置为True,即"redirects all non-HTTPS requests to HTTPS"。这似乎有效。

问题

Heroku 充当我的 Django 应用程序的代理。因此,当 Heroku 负载均衡器收到 HTTPS 请求时,它(可能)使用非 HTTPS 连接路由到我的 Web 应用程序。这吓坏了我的应用程序,它再次将其重定向到 HTTPS,引发了重定向循环。

The way to solve this seems to beSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 设置为 Django 中的设置。这告诉我的应用程序:如果代理发送标头“HTTP_X_FORWARDED_PROTO”,并且其值为“https”,则信任该连接。我试过了,效果很好。

但是,Django 文档警告我,我应该确保我的代理删除传入的“X_FORWARDED_PROTO”标头,这是有道理的:如果恶意代理通过带有 httpshttp 连接发送此标头重视我的网络应用会被愚弄。

如何检查 Heroku 是否从传入请求中去除了 X_FORWARDED_PROTO 标头?

【问题讨论】:

  • Heroku 正确发送 X-Forwarded-Proto: https 标头,请参阅 devcenter.heroku.com/articles/http-routing#heroku-headers
  • 我已经看到了。当 Heroku 收到带有已设置标头的传入请求时,它不会讨论行为。
  • 啊,对不起……你可以尝试用curl -I -H 'X-Forwarded-Proto: https' http://yourapp.heroku.com模拟一个请求,观察你是否被重定向到https。

标签: django heroku https reverse-proxy


【解决方案1】:

Heroku headers 中所述,您会发现:

X-Forwarded-Proto:HTTP请求的发起协议(例如:https)

这意味着无论原始请求标头如何,Heroku 都会设置标头。这可以通过手动设置给定标头来轻松测试,就像评论中提到的那样:

curl -I -H 'X-Forwarded-Proto: https' http://yourapp.heroku.com

这将导致 X-Forwarded-Proto 为您设置为 http

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2020-01-27
    • 2014-06-14
    • 2011-08-10
    • 2013-10-03
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多