Laravel 8.54配置fruitcake/laravel-cors后React请求报CORS Missing Allow Origin如何解决
Laravel 8 CORS 跨域问题排查步骤
按照优先级依次排查:
- 第一优先清除Laravel缓存
很多配置修改后未清空缓存会导致不生效,依次执行以下命令:php artisan config:clear php artisan route:clear php artisan cache:clear - 检查CORS中间件注册位置是否正确
确认app/Http/Kernel.php中的$middleware全局中间件数组,已经将\Fruitcake\Cors\HandleCors::class放在最开头,不要放在$middlewareGroups的api分组内,否则异常提前返回时不会携带CORS响应头。 - 检查请求路径是否匹配CORS规则
当前配置仅对api/*和sanctum/csrf-cookie开头的路径生效,如果你请求的接口路径没有/api/前缀,不会触发CORS中间件,需要将对应路径补充到paths配置数组中。 - 排查是否为Laravel异常提前返回导致的缺头
Postman不会校验CORS头,所以哪怕接口报错也能正常看到响应内容,但浏览器会先校验CORS头是否存在。如果接口触发了路由不存在、权限校验失败、表单验证错误等异常,Laravel会提前返回响应,没有走到CORS中间件,就会缺Access-Control-Allow-Origin头。
验证方法:查看storage/logs/laravel.log中对应请求的报错信息,先解决业务层面的错误,再验证CORS问题。 - 检查axios配置和CORS配置是否匹配
如果你在axios中开启了withCredentials: true,当前配置的supports_credentials: false以及allowed_origins: ['*']组合会直接触发CORS错误,要同时做两处修改:- 将
config/cors.php中的supports_credentials改为true - 将
allowed_origins改为你React项目的具体源,比如['http://localhost:3000'],不能使用通配符*
- 将
- 排查上层服务的CORS配置冲突
如果你用了Nginx、CDN、反向代理等上层服务,确认这些服务没有提前配置CORS规则,或者拦截了请求返回了不带CORS头的响应。 - 临时验证方案
可以在public/index.php文件最开头手动添加CORS头测试:
如果添加后问题解决,证明是Laravel的CORS中间件未正常触发,回到前面步骤排查中间件注册和配置即可。header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: *'); header('Access-Control-Allow-Headers: *');
内容的提问来源于stack exchange,提问作者snouck.socmed
相关产品推荐
相关产品推荐

