PreventAccessFromCentralDomains 是 stancl/tenancy v4 提供的中间件,需手动注册到 tenant.php 的租户路由组中,且必须置于 'tenancy' 之后,依赖 config/tenancy.php 中 central 和 tenant 域名配置生效,用于阻止中央域名访问租户路由。

在 Laravel 12 中使用 stancl/tenancy(v4)时,PreventAccessFromCentralDomains 是一个中间件,用于阻止通过中央域名(如 app.example.com)访问本应只在租户域名(如 tenant1.example.com)下生效的路由。它不是自动启用的,需要你手动注册并应用到租户相关路由组中。
确认中间件已存在并可用
stancl/tenancy v4 默认已提供 PreventAccessFromCentralDomains 中间件,位于:
无需额外安装或定义,只要包已正确安装(composer require stancl/tenancy)且服务提供者已注册即可使用。
在租户路由组中应用该中间件
该中间件必须显式绑定到「租户作用域内」的路由组,通常在 routes/tenant.php 中配置:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
use Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains;
Route::middleware([
'tenancy', // 必须先激活租户上下文
PreventAccessFromCentralDomains::class,
])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::get('/settings', [SettingsController::class, 'edit']);
});
⚠️ 注意:顺序很重要 —— tenancy 中间件必须在前,确保租户已被识别;否则 PreventAccessFromCentralDomains 无法判断当前是否处于中央域。
确保中央域名和租户域名配置正确
该中间件依赖 tenancy.domains.central 和 tenancy.domains.tenant 的配置来判断请求来源:
- 检查
config/tenancy.php中domains.central是否列出所有中央域名(如['app.example.com', 'localhost']) -
domains.tenant应为通配符格式(如'{id}.example.com')或正则匹配规则 - 请求 Host 头必须与配置匹配,例如用
http://app.example.com/tenant-route访问会触发拦截,而http://tenant1.example.com/tenant-route则放行
验证拦截行为(可选调试)
若未生效,可临时在中间件中加日志确认执行路径:
// 在 vendor/stancl/tenancy/src/Middleware/PreventAccessFromCentralDomains.php 的 handle() 中
\Log::debug('PreventAccessFromCentralDomains triggered. Central domains: '.json_encode(config('tenancy.domains.central')));
\Log::debug('Current host: '.$request->getHost());
也可在浏览器中用中央域名直接访问租户路由,预期返回 403 Forbidden 或自定义响应(可通过重写中间件的 deny() 方法定制)。


















