Django的HttpResponseRedirect是http而不是https

时间:2017-01-05 10:50:44

标签: django redirect nginx https

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

我添加了SSL证书并配置了nginx以将http重定向到https。收到https请求后,nginx将其作为http。

传递给Gunicorn

我的程序有时返回ip_address,浏览器会获得重定向响应并重新请求为http,因此nginx会重定向到https。

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

1 个答案:

答案 0 :(得分:9)

在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使用X-Forwarded-Proto HTTP标头传递此信息,以便相关的Django功能(如request.is_secure())正常工作。您还需要在SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')中设置settings.py