【发布时间】: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 be 将 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 设置为 Django 中的设置。这告诉我的应用程序:如果代理发送标头“HTTP_X_FORWARDED_PROTO”,并且其值为“https”,则信任该连接。我试过了,效果很好。
但是,Django 文档警告我,我应该确保我的代理删除传入的“X_FORWARDED_PROTO”标头,这是有道理的:如果恶意代理通过带有 https 的 http 连接发送此标头重视我的网络应用会被愚弄。
如何检查 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