Laravel 12 跨域报错需三步定位:先查浏览器 Network 中 OPTIONS 请求状态(404/500 表示 Nginx 拦截,无 CORS 头表示中间件未生效,后续请求失败则检查 allowed_headers 是否漏配),再确认 HandleCors 在 Kernel.php 的 $middleware 数组顶部、路由在 api.php 中,最后确保 Nginx location 块内正确配置 OPTIONS 响应并 reload。

通义灵码不是 Laravel 的调试工具,它不能直接接入你的项目运行环境去抓请求、查日志或改配置。排查 Laravel 12 的 No 'Access-Control-Allow-Origin' header 错误,关键在“定位请求卡在哪一层”,而不是依赖 AI 代码助手自动修复——灵码可辅助写配置或解释报错,但无法替代你做三步确认:中间件是否生效、预检是否被拦截、响应头是否真发出。
先看浏览器控制台和 Network 面板
打开 DevTools → Network → 复现跨域请求(比如调用 /api/user):
- 如果 OPTIONS 请求显示 404 或 500,且 Laravel 日志里完全没记录该请求 → 问题在 Nginx(或 Apache),Laravel 根本没收到
- 如果 OPTIONS 返回 200,但响应头里 没有
Access-Control-Allow-Origin→ 中间件未生效或配置错误 - 如果 OPTIONS 正常返回 CORS 头,但后续 POST/GET 仍报错 → 检查
allowed_headers是否漏了前端实际发的头(如X-Api-Key或Authorization)
检查 Laravel 12 内置 HandleCors 是否启用正确
Laravel 12 延续 9+ 的内置 CORS 支持,不再用 fruitcake 包。必须确保:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 运行
php artisan vendor:publish --tag=cors生成config/cors.php - 打开
app/Http/Kernel.php,确认\Illuminate\Http\Middleware\HandleCors::class在$middleware数组的第一位(不是$middlewareGroups['api']) - 路由必须定义在
routes/api.php中(路径默认匹配api/*),且没被手动加web中间件覆盖 - 若需带 Cookie 或 Token(
credentials: true),allowed_origins必须写具体域名,不能是['*']
重点查 Nginx 是否吞掉了 OPTIONS 预检
Laravel 12 不处理预检请求本身,只处理它放行后的实际请求。Nginx 必须显式响应 OPTIONS:
- 在 server 或 location 块中(推荐放在
location ~ ^/api/内),添加:
add_header Access-Control-Allow-Origin "http://localhost:5173";
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Max-Age "86400";
return 204;
}
- 不能把 add_header 写在 server 级别——Nginx 不继承,必须落在匹配请求路径的 location 块里
- 改完 Nginx 配置后,执行
sudo nginx -t && sudo systemctl reload nginx
验证与收尾动作
每改一处,都需对应验证:
- 改完
config/cors.php→ 运行php artisan config:clear(生产环境尤其要清缓存) - 改完 Kernel.php → 重启队列或重载 FPM(如用 PHP-FPM,可
sudo systemctl reload php*-fpm) - 用 curl 模拟预检:
curl -I -X OPTIONS http://your-api.com/api/user -H "Origin: http://localhost:5173",看响应头是否含 CORS 字段


















