laravel 11 默认集成 fruitcake/laravel-cors,cors 请求头由 config/cors.php 中 allowed_headers 控制,支持 ['*'] 或显式列表;content-type 为 application/json 时必须配置,简单请求头除外;exposed_headers 用于前端读取自定义响应头。

Laravel 11 默认使用 fruitcake/laravel-cors(已深度集成,无需额外安装),其 CORS 支持的请求头由配置文件 config/cors.php 中的 allowed_headers 项控制。
关键点:它不预设“固定列表”,而是按需允许你声明的请求头。
允许哪些请求头,取决于你如何配置 allowed_headers
在 config/cors.php 中,常见合法值包括:
['*']
允许所有请求头(包括Content-Type、Authorization、X-Requested-With、X-CSRF-TOKEN等自定义头)
✅ 开发环境常用,但注意:部分浏览器对'*'+credentials: true的组合有兼容限制(需配合exposed_headers和服务端逻辑)['Content-Type', 'Authorization', 'X-Requested-With', 'X-CSRF-TOKEN']
明确列出常用头,生产环境更安全、更可控
⚠️ 前端若发送了未在此列表中的头(如X-App-Version),预检请求(OPTIONS)将失败,实际请求被浏览器拦截['*']但需注意例外
当supports_credentials => true时,allowed_headers => ['*']在 Laravel 11 中仍可工作,但浏览器要求响应中必须明确返回Access-Control-Allow-Headers字段(中间件会自动处理),且前端发起请求时不能省略headers配置
实际生效的请求头示例(常见前端场景)
| 前端需求 | 对应需放行的请求头 | 说明 |
|---|---|---|
| 发送 JSON 数据 | Content-Type |
必须放行,否则 fetch({ headers: { 'Content-Type': 'application/json' } }) 会触发预检失败 |
| 携带 Token 认证 | Authorization |
JWT 或 Bearer Token 场景必备 |
| 使用 Laravel CSRF 保护 | X-CSRF-TOKEN |
配合 sanctum/csrf-cookie 接口使用时需要 |
| 自定义追踪或调试头 |
X-Request-ID, X-Debug 等 |
必须显式添加到 allowed_headers 数组中 |
不需要手动放行的请求头(浏览器自动允许)
以下“简单请求头”即使不在 allowed_headers 中,也不会触发预检,也不需要配置:
-
Accept -
Accept-Language -
Content-Language -
Content-Type(仅限application/x-www-form-urlencoded、multipart/form-data、text/plain这三种值)
⚠️ 注意:一旦 Content-Type 是 application/json,就不再属于“简单请求”,必须出现在 allowed_headers 中。
验证是否生效的小技巧
- 打开浏览器开发者工具 → Network → 点击一个跨域请求 → 查看 Response Headers
- 确认存在:
-
Access-Control-Allow-Headers: Content-Type, Authorization, X-CSRF-TOKEN(内容与你配置一致)
-
- 若看到
Access-Control-Allow-Headers: *,说明配置的是['*'],且服务器支持通配符响应(Laravel 11 ✅ 支持)
补充:暴露给前端的响应头(可选)
如果你的前端 JS 需要读取某些自定义响应头(如 X-RateLimit-Remaining),还需配置 exposed_headers:
'exposed_headers' => ['X-RateLimit-Remaining', 'X-RateLimit-Reset'],
否则 response.headers.get('X-RateLimit-Remaining') 将返回 null。
不复杂但容易忽略











