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

Django REST Framework中使用django-cors-headers配置CORS仅放行白名单主机

问题原因与解决方案

先明确两个独立校验规则的区别

你混淆了ALLOWED_HOSTS和CORS的功能边界,二者校验逻辑完全独立:

  • ALLOWED_HOSTS校验请求的Host头,控制哪些域名/IP可以直接访问你的Django服务本身,不在列表内的请求会直接返回400错误
  • CORS校验请求的Origin头,是浏览器同源策略的限制,服务端仅返回对应响应头告知浏览器是否放行跨域请求,不直接拦截服务端请求

你当前配置的问题及修复步骤

  1. 删除前端多余的请求头配置
    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'
  1. 修正CORS白名单的地址格式
    CORS_ALLOWED_ORIGINS内的地址需要带对应端口号,默认仅写http://127.0.0.1仅匹配80端口,如果你的前端服务运行在其他端口(比如前端常用的3000、8080端口),需要补充端口:
CORS_ALLOWED_ORIGINS = [
    # 示例:前端跑在本地3000端口就写这个
    'http://127.0.0.1:3000',
]
  1. 确认没有其他配置覆盖白名单规则
    检查全局配置中是否存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:00