CORS中间件未生效主因是注册顺序错误,须置于TrustProxies之后、其他中间件之前;同时需确保supports_credentials与allowed_origins不冲突,并正确处理预检请求。
为什么 cors 中间件没生效?检查中间件注册顺序
Laravel 的 Cors 中间件必须放在 TrustProxies 之后、路由中间件之前,否则请求可能在到达 CORS 处理前就被拦截或修改。常见错误是把它加在全局中间件末尾,或漏掉 HandleCors::class 的显式注册。
正确做法是在 app/Http/Kernel.php 的 $middleware 数组中确认位置:
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class, // ✅ 必须紧接在 TrustProxies 后
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
// ...
];
- 如果只在某个路由组加
->middleware('cors'),要确保该中间件已定义在$routeMiddleware中(Laravel 9+ 默认已预置) - Laravel 8 及更早版本需手动安装
fruitcake/laravel-cors并发布配置,Laravel 9+ 内置HandleCors,无需额外包 - 使用
php artisan route:list检查目标路由是否实际绑定了cors中间件
config/cors.php 配置项怎么填才不被浏览器拒绝?
浏览器对 Access-Control-Allow-Origin 值极其严格:不能同时设为 * 和启用凭据(withCredentials: true)。多数跨域失败源于这里配置矛盾。
典型安全配置(开发环境可放宽,生产务必收敛):