Django部署AWS EC2后注册提示Forbidden(CSRF cookie not set)求助
1. 核对settings.py核心配置
- 确保
MIDDLEWARE中包含django.middleware.csrf.CsrfViewMiddleware,且顺序必须在SessionMiddleware之后、CommonMiddleware之前:MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 位置不能错 'django.contrib.auth.middleware.AuthenticationMiddleware', # 其他中间件... ] - 检查
CSRF_TRUSTED_ORIGINS,必须将EC2公网IP/自定义域名(带协议)加入列表:CSRF_TRUSTED_ORIGINS = ['https://your-ec2-domain.com', 'http://1.2.3.4'] - 若用公网IP访问,不要设置
SESSION_COOKIE_DOMAIN和CSRF_COOKIE_DOMAIN;若用自定义域名,可设置为.your-domain.com(适配子域名)。
2. 验证register.html的CSRF令牌渲染
- 访问注册页后右键查看源码,确认
form标签内存在<input type='hidden' name='csrfmiddlewaretoken' value='xxx'>,而非直接显示{% csrf_token %}(若显示模板标签,说明模板渲染异常)。 - 确认表单
method为POST,且提交URL与视图处理URL完全匹配(避免http/https协议差异)。
3. 检查服务器运行环境
- 禁止使用
python manage.py runserver启动生产服务,改用gunicorn/uwsgi等生产级服务器,示例启动命令:gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application - 若用Nginx反向代理,必须配置请求头传递:
缺少location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; # 关键,传递请求协议 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }X-Forwarded-Proto会导致Django无法识别正确协议,进而影响CSRF Cookie设置。
4. 确认视图函数的CSRF保护
- 函数视图需添加
@csrf_protect装饰器:from django.views.decorators.csrf import csrf_protect @csrf_protect def register(request): # 视图逻辑 - 类视图需继承自带CSRF保护的基类(如
FormView),若用DRF视图,确保对session认证的请求启用CSRF保护。
5. 浏览器端Cookie检查
- 打开开发者工具(F12)→
Application标签,确认存在csrftoken和sessionidCookie。 - 检查Cookie属性:若站点用HTTPS,需设置
CSRF_COOKIE_SECURE = True;若用HTTP,则禁用该配置(否则浏览器不会保存Cookie)。
内容的提问来源于stack exchange,提问作者user8234870
相关产品推荐
相关产品推荐

