直接配好 fruitcake/laravel-cors 并确认中间件生效,90% 的跨域报错就能立刻消失;关键是确保 OPTIONS 预检通过、响应头不冲突、凭证配置一致,需检查中间件注册、cors.php 配置、CSRF 排除及 Nginx 预检处理。

直接配好 fruitcake/laravel-cors 并确认中间件生效,90% 的跨域报错就能立刻消失。重点不是加头,而是让 OPTIONS 预检请求能通、响应头不冲突、凭证配置不矛盾。
检查并启用 CORS 中间件
确保 Laravel 正确加载了 CORS 处理逻辑:
- 运行
composer require fruitcake/laravel-cors(Laravel 9+ 可跳过,但需确认已集成) - 执行
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider"生成config/cors.php - 打开
app/Http/Kernel.php,确认Fruitcake\Cors\HandleCors::class已加入$middlewareGroups['api']数组(不是只加在全局 $middleware) - 若路由定义在
routes/api.php,默认走api中间件组——这是关键,漏掉这步中间件根本不会触发
修正 cors.php 核心配置项
打开 config/cors.php,按场景调整以下几项(其他可保持默认):
-
paths:设为
['api/*', 'sanctum/csrf-cookie'],覆盖 API 接口和 Sanctum 认证必需路径 -
allowed_origins:开发用
['http://localhost:3000', 'http://127.0.0.1:3000'];生产必须写具体域名,如['https://app.example.com'];切勿在 supports_credentials = true 时写 ['*'] -
supports_credentials:前端用了
credentials: 'include'或带 Cookie/token 请求,此项必须为true -
allowed_headers:显式列出前端实际发的头,例如
['Content-Type', 'Authorization', 'X-Requested-With', 'X-CSRF-TOKEN'],漏掉Authorization就会导致带 token 的请求被拒
绕过 CSRF 对 OPTIONS 的拦截
VerifyCsrfToken 中间件会拦截 OPTIONS 请求,导致预检失败,表现为 403/空白响应、Network 面板看不到预检成功:
- 打开
app/Http/Middleware/VerifyCsrfToken.php - 在
$except数组中添加'api/*'(或更精确的'api/**'),确保所有 API 路由的 OPTIONS 请求放行 - 如果使用 Sanctum,还需检查
SESSION_DOMAIN是否设为.example.com(带前导点),否则跨域 Cookie 不会发送
排查 Nginx 层是否截断预检请求
浏览器控制台显示 OPTIONS 请求 405/403/Cancelled?说明请求根本没进 PHP,卡在 Nginx:
- 检查 Nginx 配置中对应
location ~ ^/api/块,是否包含以下内容: if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE"; add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With"; add_header Access-Control-Allow-Credentials "true"; add_header Access-Control-Max-Age "86400"; return 204; }- add_header 必须写在 location 块内,写在 server 级别不生效;同时避免与 PHP 层重复设置同一 header(如 Origin),否则会因多值报错
- 用
curl -I -X OPTIONS http://yourdomain.com/api/test测试是否返回 204 且含 CORS 头


















