Laravel 11 中 Route::domain('{account}.example.com') 可捕获子域名参数,需配置通配符域名、hosts 模拟及 Web 服务器转发,参数自动注入控制器并支持正则约束与租户校验。

在 Laravel 11 中,Route::domain() 支持用 {account} 这类占位符捕获子域名,但需注意:Laravel 默认不会自动解析子域名参数,必须显式启用「子域名路由」并正确配置域名格式。
确保域名配置支持通配符
Laravel 要识别 {account},请求的 Host 必须是形如 foo.example.com 的完整子域名。开发时需在本地 hosts 文件或 DNS 设置中模拟:
- 添加
127.0.0.1 tenant1.test和127.0.0.1 tenant2.test - 运行
php artisan serve --host=tenant1.test --port=8000(仅限单域名测试) - 生产环境需 Web 服务器(Nginx/Apache)将所有
*.example.com请求转发到 Laravel
定义带 {account} 的 domain 路由
在 routes/web.php 或 routes/domain.php 中使用:
Route::domain('{account}.example.com')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
Route::get('/profile', [ProfileController::class, 'show']);
});
此时访问 https://acme.example.com/dashboard,$account 参数值为 'acme',会自动注入到控制器方法中:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
public function index(string $account)
{
// $account === 'acme'
}
在控制器中接收和验证 {account}
参数会按顺序注入,无需额外绑定。建议加基础校验:
- 在路由中用正则约束防止非法字符:
->where('account', '[a-z0-9\-]+') - 在控制器中检查租户是否存在:
Tenant::firstWhere('slug', $account) - 避免直接拼接 SQL 或文件路径,防止子域名注入
注意跨域与 HTTPS 重定向问题
使用子域名时,APP_URL 应设为 https://example.com(不含子域),否则生成的 URL 可能错误。若强制 HTTPS,需确保通配符证书覆盖 *.example.com,并在中间件中处理重定向逻辑,避免 {account} 在跳转中丢失。










