laravel 6 无内置 api 网关,需用 fruitcake/laravel-cors 包配置 cors:安装包、手动注册服务提供者、发布并修改 config/cors.php、将 handlecors 中间件置于 api 组首位。

Laravel 6 本身没有“网关”概念,也不内置 API 网关功能。你提到的“配置 CORS 网关”,实际是指:在 Laravel 6 应用中,为对外提供 API 的入口(即类网关角色)正确启用跨域支持。常见场景是前端(Vue/React)运行在 http://localhost:3000,后端 Laravel 6 运行在 http://localhost:8000,浏览器因同源策略拦截请求。
Laravel 6 推荐且最稳妥的方式是使用 fruitcake/laravel-cors 包——它不是网关,但能以中间件形式统一处理所有 API 跨域响应,起到“逻辑网关”的作用。
✅ 正确配置步骤(Laravel 6)
1. 安装 cors 扩展包
composer require fruitcake/laravel-cors
Laravel 6 不支持自动服务发现,需手动注册服务提供者。
编辑config/app.php,在'providers'数组末尾添加:Fruitcake\Cors\CorsServiceProvider::class,
2. 发布并编辑配置文件
php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider"
生成 config/cors.php,按需修改关键项(开发环境示例):
'paths' => ['api/*', 'sanctum/csrf-cookie'], // 仅对 /api/ 开头的路由生效 'allowed_origins' => ['http://localhost:3000', 'https://your-frontend.com'], 'allowed_methods' => ['*'], 'allowed_headers' => ['Content-Type', 'X-Requested-With', 'Authorization'], 'supports_credentials' => true, // 如需带 Cookie 或 token,必须设为 true
⚠️ 注意:supports_credentials => true 时,allowed_origins *不能含 `''`**,必须写具体域名。
3. 注册中间件(关键!顺序很重要)
打开 app/Http/Kernel.php:
-
若希望所有 API 请求都走 CORS(推荐),将中间件加入
$middlewareGroups['api']:'api' => [ \Fruitcake\Cors\HandleCors::class, // ✅ 放在最前面,确保预检请求优先处理 \Illuminate\Routing\Middleware\SubstituteBindings::class, // 其他 api 中间件... ],
❌ 不要加到全局
$middleware数组(会干扰静态资源、登录页等非 API 请求)。
4. 验证路由是否绑定 cors 中间件
运行命令检查:
php artisan route:list --name=test-api
确认目标 API 路由(如 GET api/users)的 middleware 列包含 cors。
⚠️ 常见失败原因(Laravel 6 特有)
-
中间件未注册到
api组:只配了web组,而 API 路由走的是api中间件组。 -
supports_credentials和allowed_origins冲突:设了true却留着['*']→ 浏览器直接拒绝。 -
没处理 OPTIONS 预检请求:
fruitcake/laravel-cors会自动拦截并响应 OPTIONS,但前提是中间件已启用且未被前置中间件(如认证中间件)提前终止。 -
前端 fetch 没配 credentials:若后端
supports_credentials => true,前端必须写:fetch('/api/user', { credentials: 'include' })
? 替代方案(不推荐,仅临时用)
如果不想装包,可手写轻量中间件:
php artisan make:middleware ApiCors
在 app/Http/Middleware/ApiCors.php 中:
public function handle($request, Closure $next)
{
$response = $next($request);
$origin = $request->header('Origin', '');
$allowed = in_array($origin, ['http://localhost:3000', 'https://your-frontend.com']);
if ($allowed) {
$response->headers->set('Access-Control-Allow-Origin', $origin);
$response->headers->set('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type,Authorization');
$response->headers->set('Access-Control-Allow-Credentials', 'true');
}
if ($request->isMethod('OPTIONS')) {
return response('', 200)->headers->set('Access-Control-Allow-Origin', $origin);
}
return $response;
}
再在 Kernel.php 的 api 组中注册该中间件。
不复杂但容易忽略。核心就三点:装对包、配对域名、中间件放对位置。











