Shi*_*aul 4 django https reverse-proxy heroku
我有一个托管在 Heroku 上的 Web 应用程序,它使用 Django,域为(比如说)example.com。我想让所有传入http://example.com请求重定向到https://example.com.
我在 Django 中设置了SecurityMiddleware并设置SECURE_SSL_REDIRECT为“将所有非 HTTPS 请求重定向到 HTTPS”。这似乎有效。True
Heroku 充当我的 Django 应用程序的代理。因此,当 Heroku 负载均衡器收到 HTTPS 请求时,它(可能)使用非 HTTPS 连接路由到我的 Web 应用程序。这吓坏了我的应用程序,它再次将其重定向到 HTTPS,引发重定向循环。
解决这个问题的方法似乎是在 Django 中设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')为一个设置。这告诉我的应用程序:如果代理发送标头“HTTP_X_FORWARDED_PROTO”,并且其值为“https”,则信任该连接。我尝试过这个,它有效。
然而,Django 文档警告我,我应该确保我的代理删除传入的“X_FORWARDED_PROTO”标头,这是有道理的:如果恶意代理通过具有http值的连接发送此标头https,我的网络应用程序将被愚弄。
如何检查 Heroku 是否X_FORWARDED_PROTO从传入请求中删除标头?
就像Heroku headers中记录的那样,您会发现:
X-Forwarded-Proto:HTTP 请求的发起协议(例如:https)
这意味着无论原始请求标头如何,Heroku 都会设置标头。这可以通过手动设置给定的请求头来轻松测试,如评论中所述:
curl -I -H 'X-Forwarded-Proto: https' http://yourapp.heroku.com
Run Code Online (Sandbox Code Playgroud)
这将导致为您X-Forwarded-Proto设置为http。
| 归档时间: |
|
| 查看次数: |
2036 次 |
| 最近记录: |