Laravel 12 中处理 CORS 的核心是内置 Illuminate\Http\Middleware\HandleCors 中间件,需注册到 $middlewareGroups['api'] 中(置于 SubstituteBindings 之后、EnsureFrontendRequestsAreStateful 之后),并配合 config/cors.php 配置 paths、allowed_origins、supports_credentials 等项,修改后须执行 php artisan config:clear。

Laravel 12 中处理 CORS 的核心仍在 app/Http/Kernel.php,但需注意两点变化:一是 Laravel 12 已完全移除 fruitcake/laravel-cors 包的依赖,转而内置 Illuminate\Http\Middleware\HandleCors 中间件;二是默认配置更精简,需手动启用并正确放置位置。
Kernel.php 中如何配置 CORS 中间件
Laravel 12 的 HandleCors 中间件已集成在框架内,无需额外安装包。关键操作是将其注册到合适的中间件组中,不建议加到全局 $middleware 数组(会干扰非 API 请求),而应优先注入 api 中间件组:
// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// ... 其他 web 中间件
],
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Http\Middleware\HandleCors::class, // ✅ 放在这里,仅作用于 api/* 路由
],
];⚠️ 注意顺序:
HandleCors应放在SubstituteBindings之后、任何需要读取请求头或 session 的中间件之前(如认证中间件),但不能放在EnsureFrontendRequestsAreStateful之前——否则凭据(如 Cookie)可能尚未解析,导致supports_credentials失效。
配置文件 config/cors.php 必须存在且生效
运行以下命令生成配置(即使 Laravel 12 内置,仍需该文件控制行为):
php artisan vendor:publish --tag=cors
然后编辑 config/cors.php,确保关键项匹配前端实际环境:
-
paths:明确指定启用 CORS 的路径,例如['api/*', 'sanctum/csrf-cookie'] -
allowed_origins:*不可为 `['']**(若启用了凭据),必须写全域名,如['https://www.php.cn/link/8e5687e2d6ab87e5da2f833f3e8986a4', 'https://www.php.cn/link/c5e212421256cf0dcf335940944bc162']` -
supports_credentials:设为true时,前端fetch必须带credentials: 'include',且后端SESSION_DRIVER和SANCTUM_STATEFUL_DOMAINS需同步适配 -
allowed_headers:生产环境避免'*',推荐显式列出:['Content-Type', 'Authorization', 'X-Requested-With']
常见 Kernel 相关错误及修复
CORS 头没出现?
检查是否清除了配置缓存:php artisan config:clear(Laravel 12 默认启用配置缓存,修改cors.php后必须执行)OPTIONS 请求返回 405?
说明预检请求未被路由捕获——确认api中间件组已启用,且对应路由(如Route::apiResource('posts', PostController::class))确实落在api/*下;不要在routes/web.php中定义 API 路由。-
跨域请求携带 Cookie 却失败?
核对三点:-
config/cors.php中supports_credentials => true -
allowed_origins是具体域名,非* -
Kernel.php中HandleCors在EnsureFrontendRequestsAreStateful之后
-
不复杂但容易忽略。


















