Django后端CORS跨域问题:预检请求无Access-Control-Allow-Origin头
解决Django+CORS+Nginx跨域问题的步骤
1. 确认django-cors-headers配置是否生效
- 检查
INSTALLED_APPS中是否添加了corsheaders,未添加则补上 - 确保中间件顺序正确:
corsheaders.middleware.CorsMiddleware必须放在django.middleware.common.CommonMiddleware之前,顺序错误会导致配置失效 - 替换
CORS_ALLOW_ALL_ORIGINS=True为精准允许的前端域名,避免开放全部来源:CORS_ALLOWED_ORIGINS = [ "https://appli.asdf.com", # 本地开发场景可按需添加http://localhost:端口号这类地址 ] - 若前端请求携带cookie,需额外设置
CORS_ALLOW_CREDENTIALS=True
2. 排查Nginx反向代理的配置问题
Nginx可能覆盖或丢失Django返回的CORS响应头,需在后端对应的location块中明确配置:
location / { # 原有反向代理配置,示例:转发到Django本地端口 proxy_pass http://127.0.0.1:8000; # 添加CORS相关响应头 add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always; add_header Access-Control-Allow-Headers "Content-Type, Authorization" always; # 直接处理OPTIONS预检请求,无需转发至Django if ($request_method = OPTIONS) { return 204; } }
注意always参数必须添加,确保错误响应也能携带CORS头;$http_origin会自动匹配请求来源域名,配合Django的精准配置保障安全性。
3. 解决runserver_plus无日志输出的问题
- 启动runserver_plus时添加
--verbosity 2参数,强制输出详细日志:python manage.py runserver_plus --verbosity 2 - 先查看Nginx的access.log,确认请求是否转发至Django端口。若Nginx日志中无对应请求,说明前端请求地址错误或Nginx反向代理规则存在问题,请求未到达后端。
4. 验证跨域配置是否生效
- 打开浏览器开发者工具的Network面板,找到OPTIONS预检请求,检查响应头中是否存在
Access-Control-Allow-Origin,且值为https://appli.asdf.com - 用curl直接测试后端接口,排除前端或Nginx的干扰:
若curl能获取正确的CORS头,说明问题出在Nginx转发或前端配置;若curl也无法获取,需重新检查django-cors-headers的配置。curl -X OPTIONS -H "Origin: https://appli.asdf.com" https://appliai.asdf.com/getPredictions -v
内容的提问来源于stack exchange,提问作者Tyler Pranger
相关产品推荐
相关产品推荐

