Django REST Framework中使用django-cors-headers配置CORS仅放行白名单主机
问题原因与解决方案
先明确两个独立校验规则的区别
你混淆了ALLOWED_HOSTS和CORS的功能边界,二者校验逻辑完全独立:
ALLOWED_HOSTS校验请求的Host头,控制哪些域名/IP可以直接访问你的Django服务本身,不在列表内的请求会直接返回400错误- CORS校验请求的
Origin头,是浏览器同源策略的限制,服务端仅返回对应响应头告知浏览器是否放行跨域请求,不直接拦截服务端请求
你当前配置的问题及修复步骤
- 删除前端多余的请求头配置
Access-Control-Allow-Origin、Access-Control-Allow-Credentials是服务端返回给浏览器的响应头,前端发请求时主动添加这两个字段属于非法自定义头,会干扰正常CORS校验逻辑,直接删掉前端代码里的这两行:
// 删掉下面两行 config["headers"]["Access-Control-Allow-Origin"] = ENV.API_URL config["headers"]["Access-Control-Allow-Credentials"] = 'true'
- 修正CORS白名单的地址格式
CORS_ALLOWED_ORIGINS内的地址需要带对应端口号,默认仅写http://127.0.0.1仅匹配80端口,如果你的前端服务运行在其他端口(比如前端常用的3000、8080端口),需要补充端口:
CORS_ALLOWED_ORIGINS = [ # 示例:前端跑在本地3000端口就写这个 'http://127.0.0.1:3000', ]
- 确认没有其他配置覆盖白名单规则
检查全局配置中是否存在CORS_ORIGIN_ALLOW_ALL = True、CORS_ORIGIN_WHITELIST等参数覆盖了你当前的白名单配置,你当前配置中的CORS_ORIGIN_ALLOW_ALL = False是正确的,无需修改。
生效验证方式
- 跨域校验:用不在CORS白名单内的源站发起请求,浏览器控制台会直接抛出CORS错误,网络tab中可以看到OPTIONS预检请求没有返回
Access-Control-Allow-Origin头,响应会被浏览器拦截 - 主机校验:用非
127.0.0.1的Host头请求服务,比如执行curl -H "Host: test.com" http://你的服务地址,会直接返回400错误,说明ALLOWED_HOSTS生效
内容的提问来源于stack exchange,提问作者code0x00
相关产品推荐
相关产品推荐

