我最初的问题是如何为Django登录页面启用HTTPS,唯一的回应是建议我- 将整个站点设置为仅HTTPS。
鉴于我正在使用Django 1.3和nginx,将网站设为仅HTTPS的正确方法是什么?
一个回应提到了一个中间件解决方案,但有一个警告:
Django在维护POST数据时无法执行SSL重定向。请整理你的视图,以便仅在GET期间进行重定向。
关于服务器故障的有关nginx重写为https的问题,还提到了POST丢失数据的问题,而我对nginx不够熟悉,无法确定解决方案的工作情况。
和EFF的建议去HTTPS只,注意到:
设置时,应用程序必须在cookie上设置Secure属性。此属性指示浏览器仅通过安全(HTTPS)传输而不是不安全(HTTP)发送cookie。
像Django-auth这样的应用程序是否可以将Cookie设置为安全?还是我必须编写更多的中间件?
因此,就以下方面而言,配置Django / nginx组合以实现仅HTTPS的最佳方法是:
编辑 -我在测试多个浏览器时发现的另一个问题。说我有URL https://mysite.com/search/,它有一个搜索表单/按钮。我按一下按钮,处理在Django像往常一样的形式,做一个Django HttpResponseRedirect来http://mysite.com/search?results=”foo”。Nginx https://mysite.com/search?results="foo"根据需要将其重定向到。
但是,重定向发生时,Opera会有可见的闪光。而且它会在每次搜索中发生,即使是对于相同的搜索词(我想https确实不会缓存:)更糟糕的是,当我在IE中对其进行测试时,我首先会收到以下消息:
You are about to be redirected to a connection that is not secure - continue?
单击“是”后,紧接着是:
You are about to view pages over a secure connection - continue?
尽管第二个IE警告选项可以将其关闭-第一个警告则没有,因此每次有人进行搜索并将其重定向到结果页面时,他们至少会收到一条警告消息。
对于John C的答案的第二部分,以及Django 1.4 + …
你可以将更request.scheme改为,而不是扩展HttpResponseRedirect https。因为Django在Nginx的反向代理后面,所以它不知道原始请求是安全的。
request.scheme
https
在你的Django设置中,设置SECURE_PROXY_SSL_HEADER设置:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
然后,你需要Nginx在反向代理中设置自定义标头。在Nginx网站设置中:
location / { # ... proxy_set_header X-Forwarded-Proto $scheme; }
这样request.scheme == ‘https’并request.is_secure()返回True。 request.build_absolute_uri()返回https://…等等