Django中CORS_ALLOWED_ORIGINS与CORS_ALLOW_ALL_ORIGINS配置无效求助
以下是几个具体的排查和解决方向:
修正中间件顺序
确保corsheaders.middleware.CorsMiddleware是MIDDLEWARE列表的第一个,尤其要早于django.middleware.common.CommonMiddleware——CommonMiddleware会处理响应基础头,可能干扰CORS头的设置。正确顺序示例:MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 其他中间件... ]清理冲突配置
当设置CORS_ALLOW_ALL_ORIGINS = True时,CORS_ALLOWED_ORIGINS会被自动忽略,保留其中一项即可。建议删除CORS_ALLOWED_ORIGINS = ['*'],避免配置混淆。排查自定义代码干扰
检查项目中的自定义中间件或视图装饰器,是否在响应返回前移除/覆盖了Access-Control-Allow-Origin头。可临时注释自定义中间件,测试问题是否消失。检查反向代理配置(如Nginx)
如果Django部署在反向代理之后,需确保代理没有过滤CORS响应头。以Nginx为例,可在location块中添加配置:add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; if ($request_method = OPTIONS) { return 204; }或添加
proxy_pass_header Access-Control-Allow-Origin;确保传递Django生成的CORS头。验证OPTIONS请求处理
用浏览器开发者工具查看OPTIONS请求的响应,确认corsheaders是否正确返回CORS相关头。若OPTIONS请求无正确响应,需排查是否有自定义路由/中间件拦截了OPTIONS请求。清除浏览器缓存测试
浏览器可能缓存旧响应头导致新配置不生效,切换到无痕模式重新发起请求验证。升级依赖版本
确保django-cors-headers版本与当前Django兼容,建议升级到最新稳定版:pip install --upgrade django-cors-headers
内容的提问来源于stack exchange,提问作者NithishB

