我的服务器运行Django + Gunicorn + nginx。
我添加了SSL证书并配置了nginx以将http重定向到https。收到https请求后,nginx将其作为http。
传递给Gunicorn我的程序有时返回ip_address
,浏览器会获得重定向响应并重新请求为http,因此nginx会重定向到https。
我该如何避免这种情况?如何配置服务器以使第一个重定向直接指向https URL?
答案 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
。