2017-01-05 104 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

相關問題