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

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 -X OPTIONS -H "Origin: https://appli.asdf.com" https://appliai.asdf.com/getPredictions -v
    
    若curl能获取正确的CORS头,说明问题出在Nginx转发或前端配置;若curl也无法获取,需重新检查django-cors-headers的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:22:50