Django 如何通过gunicorn/nginx使用SSL防止重定向循环?

Django 如何通过gunicorn/nginx使用SSL防止重定向循环?,django,nginx,gunicorn,django-middleware,Django,Nginx,Gunicorn,Django Middleware,当使用SSL中间件将某些URL重定向到HTTPS时,我得到一个重定向循环。我该怎么办 我的nginx配置设置为将请求转发到gunicorn。这里有几个步骤 首先,修改中间件检查SSL的方式: def _is_secure(self, request): if request.is_secure(): return True if 'HTTP_X_SSL_PROTOCOL' in request.META: return True retur

当使用SSL中间件将某些URL重定向到HTTPS时,我得到一个重定向循环。我该怎么办


我的nginx配置设置为将请求转发到gunicorn。

这里有几个步骤

首先,修改中间件检查SSL的方式:

  def _is_secure(self, request):
    if request.is_secure():
      return True

    if 'HTTP_X_SSL_PROTOCOL' in request.META:
      return True

    return False
然后按如下方式更改nginx配置:

server {
    listen 80;
    listen 443 ssl;

    ...

    location / {

        ...
        proxy_set_header X-SSL-Protocol $ssl_protocol;
        proxy_pass http://localhost:8000/;
    }
}
proxy\u set\u头
仅在
ssl\u协议
不为空(即,它是一个安全连接)时才会传递


重新启动nginx,您就完成了。

添加到Tom的答案中。如果您支持Heroku或其他负载平衡器,以下内容可能也会有所帮助

def _is_secure(self, request):
    if request.is_secure():
      return True

    if 'HTTP_X_SSL_PROTOCOL' in request.META:
      return True

    # check the forwarded request's protocol
    if request.META.get('HTTP_X_FORWARDED_PROTO')=='https':
        return True

    return False

自从django 1.4以来,您不需要自定义中间件,因为它是内置的。另见。顺便说一句,nginx的技巧不错。