Laravel 11 推荐通过环境变量动态配置 CORS:在 .env 中定义 CORS_ALLOWED_ORIGINS(逗号分隔域名),config/cors.php 中用 explode(',', env('CORS_ALLOWED_ORIGINS')) 解析;启用 supports_credentials 时严禁 allowed_origins 为 ['*'],且需前端配 credentials: 'include'、后端 Cookie 设 SameSite=None; Secure。

Laravel 11 中配置 CORS 时,不建议直接在 config/cors.php 里写死域名(如 'http://localhost:3000'),而应通过 环境变量动态控制,实现开发、测试、生产环境的灵活切换。核心思路是:用 .env 定义允许的源,再在 config/cors.php 中读取并解析。
✅ 正确做法:用环境变量控制 allowed_origins
1. 在 .env 中定义跨域白名单
支持单个或多个域名,用英文逗号分隔(不含空格):
CORS_ALLOWED_ORIGINS=https://myapp.com,https://admin.myapp.com,http://localhost:3000
⚠️ 注意:生产环境*严禁设为 `
**;若需本地调试临时放开,可单独加一行CORS_ALLOW_ALL=true`,但上线前必须删掉或注释。
2. 修改 config/cors.php,读取环境变量
打开 config/cors.php,将 'allowed_origins' 改为动态解析:
'allowed_origins' => explode(',', env('CORS_ALLOWED_ORIGINS', 'http://localhost:3000')),如果想支持 * 仅用于本地开发(比如配合 CORS_ALLOW_ALL=true):
'allowed_origins' => env('CORS_ALLOW_ALL') === 'true'
? ['*']
: explode(',', env('CORS_ALLOWED_ORIGINS', 'http://localhost:3000')),✅ 同时确保其他关键项也适配环境:
'supports_credentials' => filter_var(env('CORS_SUPPORTS_CREDENTIALS', true), FILTER_VALIDATE_BOOLEAN), 'allowed_methods' => explode(',', env('CORS_ALLOWED_METHODS', 'GET,POST,PUT,DELETE,OPTIONS')), 'allowed_headers' => explode(',', env('CORS_ALLOWED_HEADERS', 'Content-Type,Authorization,X-Requested-With')),
3. 确保中间件已启用
Laravel 11 默认已集成 fruitcake/laravel-cors(v3+),无需手动安装。确认 app/Http/Kernel.php 的 $middlewareGroups['api'] 中包含:
\Fruitcake\Cors\HandleCors::class,
✅ 推荐只对 API 路由启用(即放在
'api'组),避免影响 Web 页面。
4. 配置 paths 匹配你的 API 前缀
例如你 API 全部走 /api/*,则:
'paths' => ['api/*', 'sanctum/csrf-cookie'],
? 关于 credentials(带 Cookie 登录)的特别提醒
如果你用了 supports_credentials => true(比如 Laravel Sanctum + 前端 credentials: 'include'):
-
allowed_origins*绝对不能是 `['']`** —— 浏览器会拒绝响应; -
.env中必须明确列出前端域名,例如:CORS_ALLOWED_ORIGINS=https://app.example.com,https://admin.example.com CORS_SUPPORTS_CREDENTIALS=true
- 前端请求必须带
credentials: 'include'; - 后端 Cookie 必须设置
SameSite=None; Secure(HTTPS 环境下才有效)。
? 验证是否生效
- 清除配置缓存:
php artisan config:clear
- 用浏览器开发者工具 → Network → 查看任意 API 响应头,确认含:
Access-Control-Allow-Origin: https://your-frontend.com-
Access-Control-Allow-Credentials: true(如启用) Vary: Origin
不复杂但容易忽略。


















