落地页应仅对中央域名生效:将路由移至 routes/central.php 并通过 isCentralRequest() 判断域名;用 RestrictLandingToCentral 中间件拦截租户请求;确保视图与资产不依赖租户上下文。

在 Laravel 11 的多租户架构中(比如使用 stancl/tenancy 或 spatie/laravel-multitenancy),落地页(如 /、/welcome)默认可能被所有域名(包括租户子域和主站域名)同时访问。要让它**仅对中央域名(central domain)生效,对租户域名完全屏蔽或跳转**,关键在于路由注册时机、中间件控制和请求上下文判断。
确认中央域名与租户域名的识别逻辑
大多数租户包会在请求进入时通过中间件或服务提供者解析当前域名,并设置租户上下文(如 Tenant::current() 或 Request::route()->parameter('tenant'))。你需要先明确:
- 你的租户包如何标识“中央请求”——通常是域名匹配
config('tenancy.central_domains')或未匹配到任何租户; - 中央域名是否已正确配置(例如
app.example.com),而租户是tenant1.app.example.com等; - 确保租户中间件(如
InitializeTenancy)**不作用于中央域名请求**,否则会错误加载租户环境。
把落地页路由限定在中央路由文件中
Laravel 11 推荐使用 routes/central.php(需手动创建)或利用包提供的中央路由机制。不要把 Route::get('/', ...) 放在 routes/web.php(该文件默认对所有请求生效)。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 创建
routes/central.php,写入落地页逻辑:Route::middleware('web')->group(function () {<br> Route::get('/', [PageController::class, 'home'])->name('home');<br> Route::get('/welcome', [PageController::class, 'welcome'])->name('welcome');<br>}); - 在
RouteServiceProvider的boot()方法中,**仅当请求属于中央域名时才加载该文件**:if ($this->isCentralRequest()) {<br> Route::middleware('web')<br> ->prefix('/')<br> ->group(base_path('routes/central.php'));<br>} -
isCentralRequest()可简单实现为:private function isCentralRequest(): bool<br>{<br> $host = request()->getHost();<br> $centralDomains = config('tenancy.central_domains', ['app.example.com']);<br> return in_array($host, $centralDomains);<br>}
用中间件拦截租户域名的根路径请求
即使路由未注册,租户域名仍可能因 fallback 或其他路由匹配到 /。加一层防御性中间件更可靠:
- 运行
php artisan make:middleware RestrictLandingToCentral; - 在
handle()中判断并终止:public function handle(Request $request, Closure $next)<br>{<br> if (! $this->isCentralRequest()) {<br> abort(404); // 或 redirect()->to('https://app.example.com');<br> }<br> return $next($request);<br>} - 将该中间件应用在中央路由组上,或全局注册但只对特定路径生效(如
except租户相关前缀)。
检查视图与资产是否被租户覆盖
即使路由被拦截,租户可能通过自定义主题或视图发布覆盖了 resources/views/welcome.blade.php。确保:
- 落地页视图不依赖租户上下文(如不调用
Tenant::current()); - 避免在
AppServiceProvider中对所有请求都执行租户绑定(如Tenant::current()?->configure()); - 静态资源(CSS/JS)使用绝对路径或中央域名 CDN,防止租户子域下加载失败。










