Django';s HttpResponseRedirect是http而不是https

Django';s HttpResponseRedirect是http而不是https,django,redirect,nginx,https,Django,Redirect,Nginx,Https,我的服务器运行Django+Gunicorn+nginx 我已经添加了一个SSL证书,并将nginx配置为将http重定向到https。当收到https请求时,nginx将其作为http传递给Gunicorn 我的程序有时会返回HttpResponseRedirect,浏览器会收到重定向响应并以http的形式重新请求,因此nginx会重定向到https 我怎样才能避免这种情况?如何配置服务器,使第一个重定向直接指向https URL 在nginx配置中(在位置块内),指定以下内容: proxy_

我的服务器运行Django+Gunicorn+nginx

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

我的程序有时会返回
HttpResponseRedirect
,浏览器会收到重定向响应并以http的形式重新请求,因此nginx会重定向到https


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

在nginx配置中(在
位置
块内),指定以下内容:

proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
代理重定向告诉nginx,如果后端返回HTTP重定向,它应该保持原样。默认情况下,nginx假设后端是愚蠢的,并试图变得聪明;如果后端返回一个写着“重定向到”的HTTP重定向,nginx将其替换为类似“.但Django并不愚蠢(或者可以将其配置为不愚蠢)


Django不知道请求是通过HTTPS还是普通HTTP发出的;nginx知道这一点,但它随后向Django后端发出的请求始终是普通HTTP。我们告诉nginx使用
X-Forwarded-Proto
HTTP头传递此信息,以便相关的Django功能,如
request.is_secure()
工作正常。您还需要设置
SECURE\u PROXY\u SSL\u HEADER=('HTTP\u X\u PROTO','https'))
在您的
设置.py
中,我实际上也做了同样的事情。告诉Nginx将所有http请求重定向到https,它工作得很好。我需要同时设置Nginx和django,还是只设置Nginx?我不确定您的意思。最好的办法是让django将重定向作为一个相对url返回,即“/target”而不是““。我的意思是,在我按照你所说的设置nginx之后,我是否还需要设置django settings.py,或者它只是对其他功能的一种改进。毕竟,你的回答真的很有帮助,谢谢!@permike我认为这可能对更多人有用,所以我在上写了一篇关于它的博客。”。