我有一个在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 be将SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
设置为Django中的设置。这告诉我的应用:如果代理发送标题' HTTP_X_FORWARDED_PROTO',如果其值为' https',则信任该连接。我试过这个,它确实有效。
但是,我已经被Django文档警告过,我应该确保我的代理会删除传入的' X_FORWARDED_PROTO'标头,这是有道理的:如果恶意代理通过http
连接以https
值发送此标头,我的网络应用将被欺骗。
如何检查Heroku是否从传入的请求中删除X_FORWARDED_PROTO
标题?
答案 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 。