添加SSL后Django Admin出现CSRF Token验证错误的解决求助
修复Django Admin启用SSL后的CSRF Token错误
问题根源
启用SSL后,Django无法正确识别当前请求的HTTPS协议环境,导致CSRF Cookie的安全属性不匹配、请求来源验证失败;同时Nginx反向代理未传递必要的协议头,进一步触发该问题。
修复步骤
1. 更新Nginx配置,补充HTTPS协议头
在Nginx的@proxy_to_app location块中,添加X-Forwarded-Proto头,告知Django当前请求使用HTTPS:
location @proxy_to_app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; # 新增该行,传递HTTPS协议标识 proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_pass http://app_server; }
2. 调整Django项目settings.py配置
修改以下核心配置项:
- 信任反向代理的SSL头:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
让Django识别Nginx传递的HTTPS协议信息。
- 设置安全Cookie属性:
# 强制Session Cookie仅通过HTTPS传输 SESSION_COOKIE_SECURE = True # 强制CSRF Cookie仅通过HTTPS传输 CSRF_COOKIE_SECURE = True
- 更新ALLOWED_HOSTS:
确保你的域名在允许列表内:
ALLOWED_HOSTS = ['example.com', 'www.example.com']
- 添加信任的CSRF来源(Django 3.0及以上版本):
针对域名跳转场景,配置信任的HTTPS来源:
CSRF_TRUSTED_ORIGINS = ['https://example.com', 'https://www.example.com']
3. 重启服务生效
修改配置后,依次重启Nginx和Gunicorn:
# 重启Nginx sudo systemctl restart nginx # 重启Gunicorn(根据实际服务名调整) sudo systemctl restart gunicorn
额外验证
- 彻底清除浏览器Cookie与缓存,避免旧的非安全Cookie干扰
- 确认SSL证书配置正常,无证书信任或域名不匹配问题
内容的提问来源于stack exchange,提问作者Maddie Graham
相关产品推荐
相关产品推荐

