2017-01-05 65 views
6

我的服务器运行Django + Gunicorn + nginx。Django的HttpResponseRedirect是http而不是https

我已经添加了SSL证书并配置了nginx以将http重定向到https。当收到https请求时,nginx将它作为http传递给Gunicorn。

我的程序有时返回HttpResponseRedirect,浏览器得到重定向响应并重新请求为http,所以nginx重定向到https。

我该如何避免这种情况?如何配置服务器,使第一个重定向直接指向https URL?

+0

我实际上做了同样的事情,告诉Nginx将所有http请求重定向到https并且它正在工作p retty罚款。 – Jbertrand

回答

5

在nginx的配置(location块内),指定该:

proxy_redirect off; 
proxy_set_header X-Forwarded-Proto $scheme; 

proxy_redirect告诉nginx的是,如果后端返回一个HTTP重定向,应该保留原样。默认情况下,nginx假定后端是愚蠢的,并试图变得聪明;如果后端返回一个HTTP重定向,上面写着“重定向到http://localhost:8000/somewhere”,nginx的类似于http://yourowndomain.com/somewhere”的东西取代它,但Django是不傻(或者也可以配置为不愚蠢)。

Django不知道请求是通过HTTPS还是普通的HTTP完成的; nginx知道,但是后来对于Django后端的请求总是纯HTTP,我们告诉nginx将这些信息与HTTP头一起传递,这样相关的Django功能如request.is_secure()工作正常,您还需要在您的settings.py中设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

+0

我需要设置nginx和django,还是只设置nginx? – permike

+0

我不确定你的意思。你最好的选择是将django作为相对url返回重定向,即“/ target”而不是“http:// domain/target”。 –

+0

我的意思是,在我将nginx设置为你所说的之后,我是否还需要设置django settings.py或者它只是改进其他功能。毕竟,你的回答非常有帮助,谢谢! – permike

相关问题