Laravel8出现CORS错误:Access-Control-Allow-Origin含多个*值如何解决?
问题本质
该错误的核心原因是接口响应头中Access-Control-Allow-Origin被重复添加了两次*值,浏览器CORS策略要求该响应头仅能存在一个有效值,因此直接拦截了请求。
排查步骤
- 首先检查Laravel 8自带CORS扩展配置:Laravel 8默认集成
fruitcake/laravel-cors扩展,打开config/cors.php文件,先确认paths配置是否覆盖了你的api/objectives接口路径,再检查allowed_origins是否存在重复配置的*项。 - 其次检查Web服务配置:查看Nginx/Apache的站点配置中,是否手动添加了
add_header Access-Control-Allow-Origin *;规则,如果框架层面已经处理跨域,服务层再加就会出现头重复的问题。 - 然后检查项目自定义中间件:查看全局中间件或者api路由组绑定的中间件中,有没有自己手写代码添加
header('Access-Control-Allow-Origin: *');的逻辑,也会和框架自带CORS配置冲突。 - 最后检查中间层配置:如果有用反向代理、CDN服务,确认这些中间层有没有额外添加跨域响应头。
解决方法
- 优先使用Laravel自带CORS配置处理跨域,参考正确配置如下:
// config/cors.php return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['*'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => false, ];
如果接口需要跨域携带Cookie,需要将supports_credentials改为true,同时allowed_origins不能设置为*,要填写明确的允许源,比如['http://localhost:4200']。
移除其他所有位置的重复跨域头配置:包括Web服务配置、自定义中间件、反向代理层的额外跨域头规则,全局仅保留一处跨域配置即可。
配置修改后执行
php artisan config:clear清理Laravel配置缓存,重启Web服务后再测试请求即可。
内容的提问来源于stack exchange,提问作者Shadrack Okran Arthur
相关产品推荐
相关产品推荐

