laravel 5.5 必须使用 barryvdh/laravel-cors 而非 fruitcake/laravel-cors,因后者不兼容;需手动在 config/app.php 注册 barryvdh\cors\serviceprovider::class,发布配置后显式设置 allowed_origins(禁用 '*' 配合 supports_credentials),并确保 handlecors 中间件置于认证中间件之前。

直接说结论:Laravel 5.5 没有内置 CORS 支持,fruitcake/laravel-cors 不兼容(它要求 Laravel 6+),必须用 barryvdh/laravel-cors,且中间件注册位置和配置方式稍有不同——错一步,No 'Access-Control-Allow-Origin' header 就照常报。
为什么 fruitcake/laravel-cors 在 Laravel 5.5 上会失败
fruitcake/laravel-cors 基于 Laravel 6+ 的服务提供者自动发现机制和中间件签名,Laravel 5.5 不识别它的 CorsServiceProvider,强行安装后 php artisan vendor:publish 无反应,config/cors.php 根本不会生成。这不是配置问题,是版本硬伤。
- 检查当前 Laravel 版本:
php artisan --version,确认是Laravel Framework 5.5.x - 别试
composer require fruitcake/laravel-cors—— 安装成功但完全不生效 - 正确依赖应为:
composer require barryvdh/laravel-cors
barryvdh/laravel-cors 必须手动注册服务提供者
Laravel 5.5 不支持包自动发现,barryvdh/laravel-cors 不会自己注册,漏掉这步,中间件根本不会加载。
- 打开
config/app.php - 在
'providers' => [数组末尾添加:Barryvdh\Cors\ServiceProvider::class - 运行
php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider",生成config/cors.php - 验证是否生效:执行
php artisan config:clear && php artisan config:cache,再访问任意路由看响应头(用浏览器开发者工具 Network → Response Headers)
supports_credentials = true 时 allowed_origins 不能写 ['*']
这是 Laravel 5.5 + barryvdh/laravel-cors 最常踩的坑:前端带 withCredentials: true,后端却配了 'allowed_origins' => ['*'],结果浏览器直接静默拦截,连预检请求都看不到。
- 错误现象:
Failed to load http://your-api.com/api/data: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. - 正确做法:显式列出域名,例如
'allowed_origins' => ['http://localhost:8080', 'https://app.example.com'] -
barryvdh/laravel-cors不支持通配子域名(如https://*.example.com),要动态匹配只能改写中间件逻辑 - 若只需本地开发调试,可临时设为
['http://localhost:8080'],上线前务必替换为生产域名
OPTIONS 预检请求 405 Method Not Allowed
不是 CORS 配置错了,而是 Laravel 路由没捕获 OPTIONS 请求——barryvdh/laravel-cors 的中间件虽能处理预检,但前提是请求得先到达它。如果认证中间件(如 auth:api)挡在前面,未登录用户连 OPTIONS 都过不去。
- 检查
app/Http/Kernel.php中间件顺序:Barryvdh\Cors\HandleCors::class必须放在所有auth、throttle类中间件之前 - 若只对 API 生效,把它加到
$middlewareGroups['api']开头,而非全局$middleware - 确认你的请求路径命中了
config/cors.php中的'paths',默认是['api/*'],如果路由在routes/web.php且没加->middleware('api'),CORS 中间件压根不触发 - Nginx/Apache 若配置了
add_header,可能覆盖 Laravel 输出的头;此时要么删掉服务器层 CORS 配置,要么确保 Nginx 的add_header ... always
真正麻烦的从来不是配几个数组,而是 barryvdh/laravel-cors 在 Laravel 5.5 下不报错、不提示、不抛异常,只是默默不生效——你得靠抓包看响应头、查中间件执行顺序、比对路由组绑定,才能定位到那一行漏掉的服务提供者注册。











