laravel跨域问题本质是handlecors中间件未生效,须将其置于$middleware数组顶部、配置paths覆盖实际路由、allowed_origins明确指定前端域名且supports_credentials=true时禁用通配符,并确保laragon的apache/nginx透传options请求。

在 Laragon 环境中运行 Laravel 时出现跨域问题(比如前端 Vue/React 访问 http://localhost:3000,后端 API 在 http://myapp.test),本质不是 Laragon 特有问题,而是 Laravel 的 CORS 配置未生效或未覆盖请求路径。关键在于中间件注册位置、路径匹配、凭证支持与预检请求协同——四者缺一不可。
确认并启用 HandleCors 中间件(必须放全局顶部)
Laragon 默认使用 PHP 内置服务器或 Apache/Nginx,但无论哪种,Laravel 的中间件链执行逻辑不变。务必检查 app/Http/Kernel.php 中的 $middleware 数组:
-
\Illuminate\Http\Middleware\HandleCors::class必须出现在$middleware数组最前面(例如紧接TrustProxies后),不能只放在$middlewareGroups['api']里; - 若你用的是 Laravel 9+(含 Laragon 常见的 Laravel 10/11/12/13),该中间件已内置,无需
composer require fruitcake/laravel-cors; - 改完立即执行
php artisan config:clear,避免 Laragon 缓存旧配置导致无效。
配置 config/cors.php 覆盖上传与 API 路径
运行 php artisan vendor:publish --tag="cors" 生成配置文件后,重点修改以下项(以开发环境为例):
-
paths:必须包含你实际使用的路由,如
['api/*', 'upload', 'upload/*', 'sanctum/csrf-cookie'];仅写['api/*']会导致/upload这类非 api 前缀接口被拒绝; -
allowed_origins:开发时写
['http://localhost:3000', 'http://127.0.0.1:3000'],绝不能用['*']+supports_credentials => true; -
supports_credentials:设为
true(尤其用了 Sanctum 登录态或需传 Cookie 时),否则浏览器不发 Cookie,后端鉴权失败返回 401。
确保 Laragon 的 Web 服务器透传 OPTIONS 请求
Laragon 默认用 Apache,但部分版本会拦截 OPTIONS 预检请求并返回 405 —— 此时 Laravel 根本收不到请求,中间件完全不触发。解决方法:
- 打开 Laragon 的 Apache 配置(右键 Laragon → Apache > httpd.conf),在
<directory></directory>区块内添加:
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
Header always set Access-Control-Allow-Headers "Content-Type,Authorization,X-Requested-With"
- 重启 Laragon 的 Apache(右键 → Restart All);
- 也可改用 Laragon 内置 Nginx 模式(Settings → Web Server → Nginx),并在 server 块中加
location / { add_header ... }规则,效果更稳定。
前端调用时注意 withCredentials
若后端启用了 supports_credentials => true,前端必须同步开启凭证发送,否则跨域请求仍失败:
- Axios:
axios.defaults.withCredentials = true; - Fetch:
fetch(url, { credentials: 'include' }); - Vue Query / React Query 同理需显式设置
credentials: 'include'。











