Django配置CORS拦截规则未生效 跨域请求仍可成功访问API
核心原因
你对CORS机制的适用边界存在误解,出现这个现象的本质原因有两点:
- CORS全称是跨源资源共享,仅对跨源请求生效。你通过项目自身托管的JS静态文件调用同域名、同协议、同端口下部署的API,属于标准同源请求,浏览器从一开始就不会触发CORS校验逻辑,无论你怎么修改
django-cors-headers的配置,都不会对同源请求产生拦截效果。 - 哪怕是跨源场景,CORS拦截也不是后端直接拒绝请求:后端会正常接收、处理请求并返回响应,只是浏览器在收到响应后,会校验响应里的CORS相关头,如果发现请求来源不在允许列表里,会禁止前端JS读取响应内容,同时在控制台抛出CORS错误。如果用Postman、curl这类不内置CORS安全规则的客户端发请求,不管跨不跨源、CORS怎么配置,都能正常拿到响应结果。
验证CORS配置有效性的正确方法
你当前的配置(CORS_ORIGIN_ALLOW_ALL = False、CORS_ALLOWED_ORIGINS = []、中间件顺序、已注册app)本身没有语法问题,要验证是否生效按以下步骤操作即可:
- 本地启动一个和Django服务不同端口的临时静态服务,比如在任意空目录执行
python -m http.server 8080 - 在这个8080端口的静态页面里写JS请求你Django服务(比如默认跑在8000端口)的API,此时两个服务端口不一致,属于跨源请求
- 打开浏览器开发者工具看控制台,会直接抛出CORS访问错误,JS无法读取接口返回内容,就说明配置已经正常生效。
补充说明
如果你想要实现“所有未授权来源都无法拿到接口响应”的效果,仅靠CORS配置是做不到的。CORS只是浏览器层面的前端访问限制,要从后端层面拦截非法来源请求,需要自定义中间件校验请求的Origin或Referer头,对不符合规则的请求直接返回403状态码。
另外你当前的中间件顺序是正确的,CorsMiddleware放在CommonMiddleware之前符合插件要求,不存在顺序导致的配置失效问题。
内容的提问来源于stack exchange,提问作者bernardo
相关产品推荐
相关产品推荐

