Laravel 12 的“域名限制”实为 Route::domain() 路由约束机制,通过匹配 Host 头实现子域名路由分流;它属应用层逻辑,非服务器访问控制,需配合中间件、动态数据库切换及全局作用域等才能实现真正多租户数据隔离。

“Laravel 12 域名限制”不是官方术语,而是开发者对 Route::domain() 路由约束机制的通俗说法——它指 Laravel 通过匹配 HTTP 请求头中的 Host 字段,把请求精准分发到指定域名或子域名下的路由组,从而实现按域名隔离行为。这不是服务器层的访问控制(如 Nginx 的 allow/deny),而是应用层的路由分流逻辑。
子域名路由:按 Host 分流,共用一套代码
这是 Laravel 原生能力,核心是 Route::domain()。它不改变数据模型或数据库结构,只决定“哪个 URL 该走哪段逻辑”。
- 写法示例:
Route::domain('shop.example.com')->group(...)或Route::domain('{sub}.example.com')->where('sub', 'shop|admin|api') - 作用范围在路由层:同一控制器可被多个子域名调用,也可为每个子域名配独立中间件、命名空间或配置键
- 不自动处理租户数据隔离:比如
shop.example.com和blog.example.com都能查到同一张users表里的所有用户,除非你额外加逻辑 - 适合场景:多站点(如官网、博客、后台)、功能模块分离(如
api.example.com、admin.example.com)
多租户:按租户隔离数据,保障业务独立性
多租户是一种架构设计目标,子域名路由只是其中一种识别租户的方式(还有路径前缀、Header、数据库字段等)。关键不在“怎么认出租户”,而在于“认出后怎么做”。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 数据必须隔离:可以是独立数据库、共享库+tenant_id 字段、或独立 Schema;Laravel 不自动帮你建 tenant_id 或加全局作用域,需手动实现
- 运行时动态切换:比如中间件里根据
$request->route('tenant')查租户配置,再调用Config::set('database.connections.tenant.database', ...)并DB::purge() - Session/Cookie 需显式适配:设
'domain' => '.example.com'才能让登录态跨子域名生效 - 本质是业务模型问题:一个租户不能看到另一个租户的数据,哪怕它们共用同一套代码和表结构
两者关系:子域名路由是手段,多租户是目标
你可以只用子域名路由做功能分区,完全不涉及租户概念;也可以用子域名作为租户标识,再叠加数据库切换、中间件初始化、模型作用域等一整套多租户机制。
- ✅ 正确组合:
Route::domain('{tenant}.example.com')+ 中间件读取{tenant}+ 动态切库 + 全局作用域过滤tenant_id - ❌ 常见误区:以为只要写了
Route::domain('tenant1.example.com')就等于实现了多租户——这顶多算“路由可见性隔离”,数据仍是裸奔的 - ⚠️ 注意顺序:子域名参数(如
{tenant})必须在中间件执行前就解析好,所以必须在RouteServiceProvider::mapWebRoutes()中注册,不能放在routes/web.php顶层直接调用
说到底,子域名路由解决“谁来访问”,多租户解决“访客能看到什么”。前者靠 Laravel 路由引擎,后者靠你写的中间件、模型、配置和数据库设计。










