Laravel 12 中子域名参数正则约束需通过 ->where() 显式声明,且必须紧跟 Route::domain() 后、->group() 前;参数占位符须先出现在 domain 字符串中,正则自动全匹配,不支持 {tenant?} 可选语法。

Laravel 12 允许在 Route::domain() 中对子域名参数使用正则约束,但必须通过 ->where() 显式声明,不能直接写在 domain 字符串里。关键点是:参数占位符(如 {tenant})要先出现在 domain 字符串中,再用 where() 绑定规则。
正确写法:在 domain 分组后链式调用 where
比如限制一级子域名只允许小写字母、数字和短横线:
Route::domain('{tenant}.example.com')->where('tenant', '[a-z0-9\-]+')->group(...)- 匹配
shop.example.com、my-app.example.com,但拒绝Shop.example.com(含大写)或user@site.example.com(含非法字符)
多级子域名参数也支持分别约束
若用 {sub1}.{sub2}.example.com 匹配 zzz.tenant.example.com,可为每个参数单独加规则:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
Route::domain('{sub1}.{sub2}.example.com')->where(['sub1' => '[a-z0-9\-]+', 'sub2' => '[a-z0-9\-]+'])- 这样
sub1和sub2都被限定为小写、数字或短横线,且不为空
注意 where 的位置和作用范围
->where() 必须紧跟在 Route::domain(...) 后、->group() 前,否则无效:
- ✅ 正确:
Route::domain('{tenant}.example.com')->where('tenant', '...')->group(...) - ❌ 错误:
Route::domain('{tenant}.example.com')->group(...)->where(...)(此时 where 不生效) - ⚠️ 提示:约束只影响该 domain 分组内的路由参数解析,不影响 Host 头原始值;校验失败时 Laravel 默认返回 404
避免常见陷阱
正则需严格匹配整个参数值,开头结尾不用加 ^ 和 $ —— Laravel 会自动包裹:
- 写
'[a-z0-9\-]+'即可,不要写'^[a-z0-9\-]+$' - 若允许空值或可选,不能靠正则实现,而应改用路径参数的可选语法(domain 参数本身不支持
{tenant?}) - 中文、下划线、点号等默认不被允许,如需支持,需显式加入正则,例如
'[\x{4e00}-\x{9fa5}a-z0-9\_\-]+'(需加u修饰符,但 Laravel 内部未自动加,建议避免复杂 Unicode)










