我的服务器运行 Django + Gunicorn + nginx。
我已添加了 SSL 证书并配置了 nginx 将 http 重定向到 https。当收到 https 请求时,nginx 会将其作为 http 传递给 Gunicorn。
我的程序有时会返回 HttpResponseRedirect
,浏览器会获取重定向响应并以 http 方式重新请求,因此 nginx 会重定向到 https。
我该如何避免这种情况?我该如何配置服务器,使第一次重定向直接指向一个 https URL?
我的服务器运行 Django + Gunicorn + nginx。
我已添加了 SSL 证书并配置了 nginx 将 http 重定向到 https。当收到 https 请求时,nginx 会将其作为 http 传递给 Gunicorn。
我的程序有时会返回 HttpResponseRedirect
,浏览器会获取重定向响应并以 http 方式重新请求,因此 nginx 会重定向到 https。
我该如何避免这种情况?我该如何配置服务器,使第一次重定向直接指向一个 https URL?
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并不愚蠢(或者可以配置为不愚蠢)。X-Forwarded-Proto
告诉nginx传递这些信息,以使相关的Django功能如request.is_secure()
正常工作。您还需要在settings.py
中设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
。HTTP_X_FORWARDED_PROTO ='http,http'
完全一样的地方。虽然我怀疑你的意思是请求包括值为http,http
的HTTP_X_FORWARDED_PROTO
头,但当我们可以掌握事实时,我们不应该基于猜测或推测来工作。如果你准确地表达它,你很可能会自己找到解决方案。 - Antonis Christofides