

采用PHP的Laravel框架遇到假性CORS的同源化改造解决思路总结
售价
¥1090.00
热门推荐
商品详情
商品名称:
用 Laravel 做前后端分离项目,浏览器控制台跳出来一个 CORS Missing Allow Origin,第一反应往往是"加个 cors 中间件吧"。
但我要告诉你——很多时候这是假性 CORS,真正的问题不是跨域策略,而是同源没做好。
01
什么是"假性 CORS"?
浏览器的 CORS 报错,本质是"响应里没有 Access-Control-Allow-Origin 头"。但这个"没有"分两种情况:
✅ 真性 CORS:请求确实跨域了,后端没加 CORS 头
❗ 假性 CORS:请求根本没到你的 Laravel 应用,被 Nginx、反向代理、或者上游服务短路返回了,当然也没有 CORS 头
这时候盲目加 CORS 中间件没用,因为请求压根没经过 Laravel。
02
怎么判断是不是假性 CORS?
用 curl 测一下预检(OPTIONS)请求,看响应头里 Server 字段:
curl -I -X OPTIONS -H "Origin: http://你的前端域名" http://你的API地址
如果 Server 返回的是 nginx、而响应体是 Nginx 的错误页——请求根本没进 Laravel,这就是假性 CORS。
如果 Server 返回的是你 Laravel 应用的版本或 header——那才是真性 CORS,该加中间件加中间件。
03
同源化改造的核心思路
既然问题出在"请求没进 Laravel",那就让请求必须进 Laravel:
① Nginx 全量转发:所有 location 都 proxy_pass 到 Laravel(php-fpm 或内置 server),别留静态/错误页短路
② OPTIONS 预检直通:Nginx 层对 OPTIONS 请求不做特殊处理,转发到 Laravel 让中间件处理
③ Laravel 里 HandleCors 全局注册:在 bootstrap/app.php 里全局挂载,确保所有路由(包括预检)都能命中
④ config/cors.php 精确匹配:paths 用具体前缀(如 'api/*'),别用 '*' 扩大影响面
一句话总结:Laravel 报 CORS 错别先加中间件,先 curl 看请求进没进应用——没进就是假性 CORS,先把 Nginx 同源化配好再说。