Django部署后admin输入正确凭据仍重定向回登录页如何解决
Django admin登录后循环重定向问题排查方案
第一步:检查Django settings.py中的会话、安全相关配置
- 确认
CSRF_TRUSTED_ORIGINS配置包含你的站点域名/IP。Django 4.0+版本必须显式配置该参数,否则跨域提交的登录表单会被拦截,导致登录后会话不生效,示例配置:
# 用域名访问就填域名,用IP就填IP,注意带http/https前缀 CSRF_TRUSTED_ORIGINS = ['https://your-domain.com', 'http://your-droplet-ip']
- 检查
SESSION_COOKIE_SECURE、CSRF_COOKIE_SECURE配置。如果站点没有配置HTTPS但这两个参数设为True,浏览器不会发送Cookie到HTTP站点,会出现登录后会话丢失的情况。如果当前用HTTP访问,先把这两个值设为False,配置HTTPS后再改为True。 - 确认
SESSION_COOKIE_DOMAIN配置正确。如果填了不符合站点的域名,Cookie会被浏览器拒收,没有特殊需求可以直接注释掉该参数,让Django自动适配。
第二步:检查Nginx配置
- 确认Nginx反向代理配置正确传递了请求头,尤其是
Host和X-Forwarded-Proto头,缺少的话Django无法识别正确的请求来源,示例正确配置段:
location / { proxy_pass http://127.0.0.1:8000; # 替换为你gunicorn监听的地址端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
- 检查Nginx是否存在错误的重定向规则,比如额外把
/admin路径重定向到其他地址,可查看Nginx错误日志/var/log/nginx/error.log确认是否有相关报错。
第三步:检查Django代理头识别配置
在settings.py中添加以下配置,让Django信任Nginx传递的X-Forwarded-Proto头:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
如果没有该配置,即使Nginx传了协议头,Django也会默认认为请求是HTTP的,HTTPS站点下就会出现Cookie安全校验不通过的问题。
第四步:检查Gunicorn配置和运行状态
- 确认Gunicorn启动的工作进程用户有权限读写Django的会话存储目录(默认是
/tmp目录,如果配置了数据库/Redis存储会话就检查对应存储的权限和连接是否正常)。 - 每次修改配置后都要重启Gunicorn服务,避免旧配置未生效。
验证规则
每修改一项配置后依次重启Gunicorn、Nginx,再用浏览器无痕模式访问站点测试,避免浏览器缓存旧Cookie导致测试结果不准。
内容的提问来源于stack exchange,提问作者Amit Sarje
相关产品推荐
相关产品推荐

