Nginx端口80可访问Django Admin,换其他端口遇403 CSRF验证失败
解决Django Admin在非80端口下的CSRF 403错误
核心问题
你遇到的CSRF验证失败,是因为Django的CSRF机制需要信任外部访问时的完整请求地址(包括端口),而你之前配置的CSRF_TRUSTED_ORIGINS=["http://backend_nginx:81"]是容器内部的服务地址,浏览器发起请求时不会使用这个地址作为Origin/Referer,所以无法通过验证。
解决方案
1. 修正CSRF_TRUSTED_ORIGINS配置
在Django的settings.py中,将CSRF_TRUSTED_ORIGINS设置为你实际访问时使用的完整地址:
- 本地测试场景:
CSRF_TRUSTED_ORIGINS = ["http://localhost:81"] - 远程服务器场景(假设服务器IP为192.168.1.100):
CSRF_TRUSTED_ORIGINS = ["http://192.168.1.100:81"] - 域名访问场景:
CSRF_TRUSTED_ORIGINS = ["http://your-domain.com:81"]
2. 配置Django识别反向代理请求信息
在settings.py中添加或修改以下配置,确保Django能正确获取外部请求的Host和端口:
USE_X_FORWARDED_HOST = True # 若后续使用HTTPS,再添加下方配置,当前HTTP环境可忽略 # SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
3. 优化Nginx代理头配置(可选但推荐)
修改Nginx配置中的Host头,确保传递完整的请求Host(包含端口):
location / { proxy_pass http://backend:8000; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 可选:传递协议信息,方便Django判断HTTP/HTTPS proxy_set_header X-Forwarded-Proto $scheme; }
4. 重启服务
修改配置后,重启Django和Nginx容器生效:
docker-compose restart backend backend_nginx
关键说明
CORS_ALLOW_ALL_ORIGINS用于解决跨域资源共享问题,和CSRF验证无关,无需依赖该配置解决当前问题。- 你提到“只有主机端口为80时才可正常访问”,是因为80是HTTP默认端口,浏览器请求时不会在Host头中显式携带端口,Django默认信任不带端口的同源地址;而使用非默认端口时,必须显式将带端口的地址加入
CSRF_TRUSTED_ORIGINS。
内容的提问来源于stack exchange,提问作者UMR
相关产品推荐
相关产品推荐

