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

部署AWS Fargate后Django Admin CSRF失败:Nginx与Django配置方案

解决AWS Fargate下Nginx+Gunicorn+Django的CSRF Failed问题

这种情况我之前在部署Django到AWS Fargate时也碰到过,核心问题就是负载均衡器和Nginx没把用户真实的请求信息(协议、主机、端口)正确传递给Django,导致Django生成的CSRF校验信息和实际请求不匹配,自然就报错了。下面分两步调整配置就能解决:

一、修改Nginx配置,传递真实请求信息

在你的Nginx配置文件(比如/etc/nginx/conf.d/default.conf)的server块里,给location /添加以下请求头配置,确保把负载均衡器过来的真实请求参数转发给Gunicorn:

server {
    listen 80;
    server_name your-domain.com; # 替换成你的实际域名

    location / {
        proxy_pass http://gunicorn:8000; # 这里对应你docker-compose里Gunicorn的服务地址,按需调整
        # 关键配置:传递真实的请求来源信息
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        # 确保Host头正确传递,避免Django识别错误
        proxy_set_header Host $host;
    }
}

这些X-Forwarded-*头的作用是告诉Django:用户实际访问的协议(HTTP/HTTPS)、主机名、端口是什么,而不是容器内部的本地地址。

二、修改Django的settings.py配置

接下来要让Django信任这些转发过来的请求头,并基于这些信息生成正确的CSRF校验内容:

1. 配置代理信任与协议识别

在settings.py中添加或修改以下配置:

# 允许访问的主机,添加你的域名和负载均衡器地址
ALLOWED_HOSTS = ['your-domain.com', 'load-balancer-xxx.elb.amazonaws.com']

# 开启对X-Forwarded-*头的支持
USE_X_FORWARDED_HOST = True
# 告诉Django通过X-Forwarded-Proto头判断请求是否为HTTPS(如果负载均衡器做了HTTPS终止)
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# 如果你的负载均衡器用的是HTTPS,建议开启这两个选项,提升安全性
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

2. 配置CSRF信任来源(Django 3.2+版本必填)

对于Django 3.2及以上版本,需要明确配置CSRF_TRUSTED_ORIGINS,把用户实际访问的域名(带协议)加进去:

CSRF_TRUSTED_ORIGINS = ['https://your-domain.com', 'https://load-balancer-xxx.elb.amazonaws.com']

注意这里的协议要和用户实际访问的一致,如果负载均衡器用的是HTTP(不建议生产环境),就改成http://开头。

配置完成后,重新构建并推送你的容器到Fargate,再测试Django Admin登录,应该就不会再出现CSRF失败的异常了。

内容的提问来源于stack exchange,提问作者user1383029

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:32:49