Laravel 7 配置 Fetch 跨域需安装 fruitcake/laravel-cors 包,将 HandleCors 中间件加入 $middlewareGroups['api'],并严格匹配 credentials:allowed_origins 必须为具体域名、supports_credentials 设为 true、allowed_headers 显式声明;前端 fetch 必须设 credentials: 'include',且 Nginx/Apache 需放行 OPTIONS 请求。

直接在 Laravel 7 中配置 Fetch 跨域请求,核心是让后端正确响应浏览器的预检(OPTIONS)和实际请求,并与前端 fetch 的选项(如 credentials)严格匹配。Laravel 7 默认不内置 CORS 支持,需手动引入 fruitcake/laravel-cors 包并精细配置。
安装并启用 fruitcake/laravel-cors
Laravel 7 不自带 HandleCors 中间件,必须显式安装第三方包:
- 运行
composer require fruitcake/laravel-cors - 发布配置:运行
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider",生成config/cors.php - 打开
app/Http/Kernel.php,将中间件加入$middlewareGroups['api'](推荐),例如:'api' => [ ..., \Fruitcake\Cors\HandleCors::class ]
⚠️ 不要加到全局$middleware,否则登录页、静态资源也会被注入 CORS 头,易引发干扰
关键 cors.php 配置项(适配 fetch 行为)
Fetch 默认不发送 Cookie,但一旦设置 credentials: 'include',后端就必须同步满足三项条件,缺一不可:
-
allowed_origins 必须写具体域名,不能是
*;例如:['http://localhost:3000', 'https://myapp.com']</li> <li><strong>supports_credentials</strong> 必须设为 <code>true
-
allowed_headers 若 fetch 带自定义头(如
Authorization),需明确列出:['Content-Type', 'X-Requested-With', 'Authorization'],避免用['*'](部分 CDN 或网关会拦截) -
paths 建议设为
['api/*'],精准覆盖 API 路由,不误伤其他路径
前端 fetch 写法必须与后端一致
后端配了 supports_credentials => true,前端 fetch 就不能省略 credentials 选项:
- ✅ 正确(带凭证):
fetch('/api/user', { credentials: 'include' }) - ❌ 错误(不带凭证却期望 Cookie):
fetch('/api/user')(默认credentials: 'omit',Session 不会发送) - ⚠️ 若后端
allowed_origins是['*'],前端 绝对不可 设credentials: 'include',否则浏览器直接拒绝,控制台报错 “Origin header is not allowed”
排查 OPTIONS 请求是否到达 Laravel
如果 fetch 报错且 Network 面板看不到 OPTIONS 请求,说明预检被拦在 Web 服务器层:
- Nginx 需显式放行 OPTIONS:在 server 块中添加
if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin '*'; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; add_header Access-Control-Max-Age 1728000; add_header Content-Type 'text/plain; charset=utf-8'; add_header Content-Length 0; return 204; } - Apache 需启用
mod_headers并在虚拟主机中配置Header set Access-Control-Allow-Origin "*"等规则 - 确认 Laravel 日志中是否有 OPTIONS 请求记录;没有则说明根本没进 PHP 层


















