在Nginx后使用HTTPS访问Django管理页面

8
我已经在nginx后面的uwsgi中运行了django。当我尝试访问https://site/admin/时,我会得到预期的登录界面。通过表单登录似乎成功了,但是,我最终只是回到登录界面。Firebug显示重定向到纯粹的http://site/admin/ url,然后由nginx重定向到https url。

帮帮忙!我不知道如何强制管理应用程序仅使用https url。
请注意,这似乎是一个相关的未解答问题:https://example.com/admin redirects to https://admin in Django Nginx and gunicorn
3个回答

11

将以下内容添加到nginx.conf中解决了我的问题。

location / {
    ...
    include                 uwsgi_params;
    uwsgi_param             HTTP_X_FORWARDED_PROTOCOL https;
    uwsgi_param             UWSGI_SCHEME   $scheme;
}

在settings.py中添加以下内容:

SESSION_COOKIE_SECURE = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
CSRF_COOKIE_SECURE = True

7
如果使用 proxy_pass 而不是 uwsgi,请在 nginx.conf 中使用 proxy_set_header X-Forwarded-Protocol $scheme - Gringo Suave

2
以下内容应该足够让您将所有流量重定向到https管理员应用程序:
location /site/admin/ {
  rewrite ^ https://$host/$request_uri permanent;
}

如果那样做不起作用,您能否发布您实际的nginx配置片段?我无法在没有实际配置的情况下提出更多建议。

好主意,尽管最终我让它以不同的方式工作了。 - justinzane
并不适用于POST请求,尤其是任何API回调。 - Antigluk

0

关于Django 1.8的settings.py更新:

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_REDIRECT_EXEMPT = [r'^(?!admin/).*']

对于您的开发环境,您可能需要在本地设置中覆盖SECURE_SSL_REDIRECT = False


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接