laravel 9 中为 graphql 接口配置 cors 的核心是确保 options 预检通过且 post /graphql 请求被正确放行:需在 config/cors.php 的 'paths' 中显式添加 'graphql' 或对应路径,将 handlecors 中间件绑定至 graphql 路由(如 ->middleware('cors')),并配置 allowed_methods、allowed_origins(禁用 '*' 以支持凭证)、allowed_headers 及 supports_credentials=true;文件上传时需确保 allowed_headers 包含必要头。

在 Laravel 9 中为 GraphQL 接口配置 CORS,核心是确保预检请求(OPTIONS)能被正确响应,且实际 GraphQL 请求(POST /graphql)携带的 Origin、Content-Type 等头信息不被拦截。Laravel 自带的 fruitcake/laravel-cors 包默认只对 api/* 路由生效,而 GraphQL 路由(如 /graphql)通常不在该前缀下,因此需显式启用。
确认 GraphQL 路由已注册并匹配 CORS 中间件
Laravel 9 默认不内置 GraphQL 路由,你大概率使用的是 rebing/graphql-laravel。它默认将路由注册在 routes/api.php 或通过服务提供者自动注册。检查是否已启用 API 路由组中间件:
- 打开
app/Providers/RouteServiceProvider.php,确认mapApiRoutes()方法被调用; - 查看
config/cors.php中'paths'是否包含'graphql'或'api/graphql'(取决于你注册的路径); - 若你自定义了 GraphQL 路由(如
Route::post('/graphql', ...)->name('graphql')),需手动为其加中间件:->middleware('cors')。
调整 cors.php 配置适配 GraphQL 场景
GraphQL 请求通常是 POST,且 Content-Type 为 application/json 或 multipart/form-data(文件上传时)。需确保配置允许:
-
'allowed_methods' => ['*'](或至少包含['GET', 'POST', 'OPTIONS']); -
'allowed_origins' => ['http://localhost:5173', 'https://your-frontend.com'],避免用['*'](尤其含凭证时不可用); -
'allowed_headers' => ['*']或显式列出:['Content-Type', 'Authorization', 'X-Requested-With']; - 若前端发送带认证的请求(如 Bearer Token),务必设
'supports_credentials' => true,并确保前端 fetch 设置credentials: 'include'。
处理文件上传场景下的特殊 CORS 需求
当 GraphQL 使用 UploadType 实现文件上传时,请求可能为 multipart/form-data,且含多个字段(如 operations、map、0)。此时需额外注意:
- 确保
'allowed_headers'包含'Content-Disposition'(某些客户端会发送); - 预检请求(OPTIONS)不会携带
Content-Type: multipart/form-data,所以只要allowed_methods和allowed_headers覆盖基础头即可; - 后端解析逻辑(如
Rebing\GraphQL\Support\UploadType)本身不依赖 CORS,但前端能否发起请求完全取决于预检是否通过。
验证与调试建议
用浏览器开发者工具 Network 面板观察请求:
- 先看是否有 OPTIONS 请求发出,并返回 200;
- 再看 POST /graphql 是否返回 200,响应头中是否含
Access-Control-Allow-Origin; - 若报错 “No 'Access-Control-Allow-Origin' header”,说明中间件未命中,检查路由是否真走到了
cors中间件链; - 可临时在
app/Http/Kernel.php的$middlewareGroups['api']中追加\Fruitcake\Cors\HandleCors::class强制全局生效(仅调试用)。











