Laravel 13 后台域名白名单中间件用于二次校验 Host,仅作兜底,不可替代 Route::domain();需配置白名单、精准绑定路由组,并配合 Nginx 层防护与 Token 鉴权。

给 Laravel 13 后台(如 admin.yourapp.com)单独加一层域名白名单中间件,核心是「拦截非授权子域请求」,但要注意:这层中间件是补充手段,不能替代路由级的 Route::domain() 控制。真正可靠的拦截应在路由匹配阶段完成,中间件只做二次校验或特殊逻辑兜底。
明确目标和适用场景
后台域名白名单中间件适用于以下情况:
- 需要对
admin.*子域下的所有 API 或页面统一做 Host 校验(比如允许admin.yourapp.com和staging-admin.yourapp.com,但拒绝hacker.com伪造 Host 请求) - 路由已通过
Route::domain('admin.yourapp.com')匹配,但你还想在进入控制器前再确认一次 Host 值(防配置遗漏或反向代理异常) - 需结合业务逻辑动态判断——例如从数据库查当前租户绑定的后台域名,而非写死在配置里
创建并注册中间件
运行命令生成中间件:
php artisan make:middleware CheckAdminDomain
编辑 app/Http/Middleware/CheckAdminDomain.php,关键逻辑如下:
- 读取当前请求 Host:
$host = $request->getHost(); - 获取白名单(推荐从配置文件读取,便于多环境管理):
$whitelist = config('admin.domains', ['admin.yourapp.com', 'localhost:8000']); - 严格比对:
if (!in_array($host, $whitelist)) { abort(403, 'Access denied: invalid admin domain'); } - 必须返回:
return $next($request);,否则请求中断
绑定到后台路由分组
不要全局注册,而是精准绑定到后台相关路由。例如在 routes/web.php 中:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
Route::domain('{sub}.yourapp.com')
->where('sub', 'admin|staging-admin')
->middleware('check.admin.domain')
->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
// 其他后台路由...
});
同时确保该中间件已在 app/Http/Kernel.php 的 $routeMiddleware 中注册:
'check.admin.domain' => \App\Http\Middleware\CheckAdminDomain::class,
配合配置与安全提醒
在 config/admin.php 中定义白名单(若未创建可手动新建):
return [
'domains' => [
'admin.yourapp.com',
'staging-admin.yourapp.com',
'localhost:8000',
],
];
注意三点:
- Host 可被伪造:该中间件仅防误用或低级扫描,不能替代 Token/JWT 鉴权
-
不处理静态资源:
/favicon.ico、/robots.txt等仍会绕过,需 Nginx/Apache 层额外限制 - 优先用 Route::domain():它在 Laravel 路由解析早期就匹配失败,不进中间件链,性能和安全性更高










