You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:40:40