Heroku是否会删除传入的X-Forwarded-Proto标头?

时间:2015-10-03 19:08:10

标签: django heroku https reverse-proxy

我想做什么

我有一个在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'标头,这是有道理的:如果恶意代理通过http连接以https值发送此标头,我的网络应用将被欺骗。

如何检查Heroku是否从传入的请求中删除X_FORWARDED_PROTO标题?

1 个答案:

答案 0 :(得分:2)

Heroku headers中记录的一样,您会发现:

  

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

这意味着无论原始请求标头如何,标头都将由Heroku设置。这可以通过手动设置给定标头来轻松测试,如评论中所述:

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

这会导致X-Forwarded-Proto被设置为 http