laravel 11 中 allowed_origins 不可为 且 supports_credentials=true,因浏览器禁止带凭证时使用通配符;开发无凭证时可设 [''] 并保持 supports_credentials=false;生产需用白名单、动态判断或 allowed_origins_patterns。

在 Laravel 11 中,不能对 allowed_origins 使用通配符 * 同时开启 supports_credentials => true。这是浏览器强制的安全限制——一旦前端请求携带 Cookie 或认证凭据(如 withCredentials: true),服务端的 Access-Control-Allow-Origin 响应头就**必须指定确切的源域名**,不可为 *。
允许所有源(开发环境快速调试)
若仅用于本地开发、且前端不发送凭证(比如未启用 Session/Cookie 认证),可安全配置通配符:
- 编辑
config/cors.php - 将
'allowed_origins' => ['*'] - 保持
'supports_credentials' => false(默认值)
此时浏览器接受 Access-Control-Allow-Origin: *,跨域请求能通过。
需要携带凭证时的替代方案
生产环境或使用 Sanctum/Laravel Session 时,前端通常需带 Cookie,这时必须禁用 *,改用动态或明确白名单:
-
明确列出可信域名:如
['https://app.example.com', 'https://staging.app.example.com'] -
运行时动态判断:在自定义中间件中读取
$request->getOrigin(),匹配白名单后才设置响应头(注意防止 Origin 欺骗) -
使用正则模式(Laravel 11+ 支持):配置
'allowed_origins_patterns' => ['https://*.example.com'],比通配符更安全可控
特别注意:paths 和中间件注册
即使用了通配符,也需确保 CORS 中间件已生效:
- Laravel 11 默认已集成 CORS 逻辑,但需确认
config/cors.php已存在并正确发布(php artisan vendor:publish --tag=cors) - 检查
app/Http/Kernel.php的$middlewareGroups['api']是否包含\Fruitcake\Cors\HandleCors::class(推荐只作用于 API 路由) -
'paths' => ['api/*', 'sanctum/csrf-cookie']必须覆盖你实际使用的接口路径
通配符不是万能开关,它和凭证支持互斥。该限制来自浏览器规范,Laravel 无法绕过。关键是根据你的认证方式选对策略。











