我正试图将我的Django + Heroku应用程序从以下地方重定向 http
到 https
但我很惊讶,我没有发现任何的。安全的 和直接的方式。
问题
你已经配置了一个SSL端点,现在你想让你的应用程序对所有请求使用https。
解决方法
重定向需要在应用层执行,因为Heroku路由器不提供这个功能。您应该在您的应用程序中编写重定向逻辑。
在下面,Heroku路由器(over)写入X-Forwarded-Proto和X-Forwarded-Port请求头。应用程序检查X-Forwarded-Proto,并在不是https而是http的情况下用重定向响应。
...
姜戈
设置
SECURE_SSL_REDIRECT
到True
.
所以必须在Django处完成。这是最完整的答案 我发现,和 这个 也是类似的。
Django 1.8将对非HTTPS重定向有核心支持(集成自 django-secure):
SECURE_SSL_REDIRECT = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
为了使
SECURE_SSL_REDIRECT
要处理你必须使用SecurityMiddleware
:MIDDLEWARE = [ ... 'django.middleware.security.SecurityMiddleware', ]
注意,两者都使用
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
看来,如果没有这个设置,在Heroku上是不行的。现在是有趣的部分。正如在 文件:
SECURE_SSL_REDIRECT
...
如果将此设置为True会导致无限重定向,这可能意味着你的网站是在代理服务器后面运行的,并且无法判断哪些请求是安全的,哪些不是。您的代理服务器可能会设置一个头来指示安全请求;您可以通过找出该头的内容并配置好的
SECURE_PROXY_SSL_HEADER
据此进行设置。
然后,检查关于 SECURE_PROXY_SSL_HEADER
:
警告
如果你在不知道自己在做什么的情况下设置这个,很可能会给你的网站打开安全漏洞。而如果你在应该设置的时候没有设置。认真的说。
这让我想找到一个更安全的解决方案... ... 在 这另一个问题 它说 应该没问题但我觉得它没有足够的说服力来忽略这样的警告。
难道Django真的没有其他的解决方案吗?安全的 来实现?
我使用的是1.11版本
更新。
我找到了 django-sslify包但它也需要设置 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
,所以我想它在潜在的安全漏洞方面并没有什么区别。如果这个假设是错误的,请纠正我。
我迟到了,但我认为这里的关键是简单地理解你正在做什么。我希望我明白我在做什么,但说实话,我不是100%确定。我认为如果你盲目使用HTTP_X_FORWARDED_PROTO是很危险的,因为它会让Django认为你正在接收一个HTTPS请求(即使HTTP_X_FORWARDED_PROTO事实上是被欺骗的)。
但是,如果你使用的是一个正常运行的负载均衡代理(比如AWS),那么你可以确信HTTP_X_FORWARDED_PROTO的设置是正确的。在这种情况下,HTTP_X_FORWARDED_PROTO的作用是告诉Django,它很好,不要担心(因为你相信代理不允许通过欺骗的头),并停止尝试不断重定向到SSL。
最后,HTTP_X_FORWARDED_PROTO在代理负载均衡器背后是必要的,即使你 不是 使用SECURE_SSL_REDIRECT = True(例如,如果重定向是在一个正确配置的Web服务器中发生的,然后再到Django),因为它也会影响请求上的is_secure()函数,如果你的代理服务器正在吞噬原始请求,它将始终是假的(例如,从客户端和你的代理负载平衡器之间的HTTPS到你的代理负载平衡器和Web服务器之间的HTTP是很常见的)。
来源于 https:/docs.djangoproject.comen3.0refsettings#std:setting-SECURE_PROXY_SSL_HEADER 但我不得不读了多遍才把这一切在脑海中拼凑出来。