laravel 6 官方推荐使用 fruitcake/laravel-cors 而非 spatie/laravel-cors,因后者已停止维护且不兼容 laravel 6 的服务提供者注册机制;需手动注册服务提供者、发布配置、将 handlecors 中间件置于 api 组首位,并验证响应头。

Laravel 6 并不原生支持 spatie/laravel-cors,官方推荐且兼容的包是 fruitcake/laravel-cors——它正是由 Spatie 团队早期开发、后移交 Fruitcake 维护的分支。很多资料中提到的 “Spatie 的 cors 包”,实际指向的就是这个包(历史原因导致名称混用)。在 Laravel 6 中,spatie/laravel-cors 已停止维护,且不兼容 Laravel 6 的服务提供者注册机制。
为什么不能直接用 spatie/laravel-cors?
该包最后稳定版本仅支持 Laravel 5.5–5.8;Laravel 6 要求服务提供者显式注册、中间件顺序严格、配置发布方式不同,而 spatie/laravel-cors 缺乏适配。强行安装会导致:
- 服务提供者无法自动发现,需手动添加但类路径已失效
- 发布命令
php artisan vendor:publish --tag="cors"报错或无反应 - HandleCors 中间件类名或命名空间不匹配,启动时报
Class not found
正确做法:用 fruitcake/laravel-cors(即“Spatie 系谱”的现行版)
这是 Laravel 6 官方文档和社区一致采用的方案,本质是同一套逻辑的延续升级版。
- 安装命令:
composer require fruitcake/laravel-cors - 手动注册服务提供者:在
config/app.php的'providers'数组末尾加入Fruitcake\Cors\CorsServiceProvider::class - 发布配置:
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider",生成config/cors.php - 关键配置示例(开发环境):
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_origins' => ['http://localhost:3000'],
'allowed_methods' => ['*'],
'allowed_headers' => ['Content-Type', 'X-Requested-With', 'Authorization'],
'supports_credentials' => true
中间件必须放在 api 组首位
打开 app/Http/Kernel.php,确保 $middlewareGroups['api'] 中第一项是:\Fruitcake\Cors\HandleCors::class
这样能保证预检(OPTIONS)请求被优先拦截处理,避免被后续中间件(如认证、绑定)拒绝。
不要加到全局 $middleware 数组——否则静态资源、登录页等非 API 请求也会被注入 CORS 头,可能引发意外行为。
验证是否生效
启动开发服务器后,对任意 /api/xxx 接口发起请求,检查响应头中是否包含:
Access-Control-Allow-Origin: http://localhost:3000Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS-
Access-Control-Allow-Credentials: true(若启用了 credentials)
若看到这些头,说明配置成功。浏览器控制台不再报 “CORS header ‘Access-Control-Allow-Origin’ missing” 类错误。











