laravel 10 中配置 cors 多域名需在 config/cors.php 的 allowed_origins 中明确列出完整协议、端口、子域名的数组,且当 supports_credentials => true 时禁止使用 '*',必要时通过中间件动态匹配子域名并验证响应头。

在 Laravel 10 中配置 CORS 并指定多个域名,核心是正确设置 allowed_origins 数组,同时确保 supports_credentials 与之兼容(若需携带 Cookie 或认证头)。
修改 config/cors.php 中的 allowed_origins
安装并发布配置后(php artisan vendor:publish --provider="Fruitcake\Cors\CorsServiceProvider"),打开 config/cors.php,将 allowed_origins 设为明确的域名数组:
-
开发环境示例:
'allowed_origins' => ['http://localhost:3000', 'http://localhost:5173', 'https://staging.myapp.com'] -
生产环境必须避免使用
*,否则supports_credentials => true会失效 - 协议、端口、子域名均需完全匹配,
http://myapp.com和https://myapp.com视为不同源
注意 credentials 支持的限制
若前端请求携带 Cookie 或 Authorization 头(即设置了 credentials: 'include'),则必须同时满足:
'supports_credentials' => true-
'allowed_origins'不能含'*',必须列出具体域名 - 前端发起请求时,Origin 必须严格等于数组中某一项(不含通配符子域)
按需扩展:支持子域名通配逻辑(非 config/cors.php 原生支持)
官方包不支持 allowed_origins => ['*.example.com'] 这类通配写法。如需动态匹配子域名(如 app.example.com、admin.example.com),可:
- 在中间件中手动判断 Origin 是否符合子域规则,再动态设置响应头
- 或在
config/cors.php的paths对应路由里,用自定义中间件替代 HandleCors - 例如:
$origin = $request->header('Origin'); if (preg_match('/\.example\.com$/', $origin)) { $response->headers->set('Access-Control-Allow-Origin', $origin); }
验证是否生效
发送一个带 Origin 头的预检(OPTIONS)请求,检查响应中是否包含:
-
Access-Control-Allow-Origin: https://staging.myapp.com(值与请求 Origin 完全一致) -
Access-Control-Allow-Credentials: true(仅当启用 credentials 时存在) -
Access-Control-Allow-Methods和Access-Control-Allow-Headers符合配置











