最可靠的方式是用 Route::domain('www.example.com') 包裹首页路由,确保其定义在其他域名分组之前且不设无域名约束的兜底路由,避免中间件校验的资源浪费与安全隐患。

要让 Laravel 13 的首页(比如 /)只响应来自 www.example.com 的请求,最可靠的方式是用 Route::domain() 显式限定主域名,同时避免无域名约束的兜底路由干扰。
✅ 推荐:路由级限制 —— 用 Route::domain() 包裹首页
这是原生、高效、语义清晰的做法。Laravel 在路由匹配阶段就完成判断,不匹配则完全不执行中间件或控制器。
- 在
routes/web.php中,把首页路由写在Route::domain('www.example.com')分组内:
Route::domain('www.example.com')->group(function () {
Route::get('/', [HomeController::class, 'index']);
});
- 确保这个分组定义在所有其他
Route::domain()之前(比如子域名或泛域名),否则example.com或api.example.com可能被误匹配 - 不要在同一个文件里再写一个无
domain()的Route::get('/')——它会成为“默认捕获器”,破坏限制效果
⚠️ 不推荐:中间件校验 Host 头(仅作补充)
如果因历史原因必须保留无域名约束的路由结构,可加中间件拦截,但它有明显短板:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 请求已进入 Laravel 生命周期,Session、CSRF 等已初始化,资源被浪费
- 对
/favicon.ico、/robots.txt等静态路径同样生效,但无法阻止它们被访问 - 需手动检查
$request->getHost(),且必须放在中间件链最前端(否则可能被前置中间件中断)
示例中间件逻辑:
if ($request->getHost() !== 'www.example.com') {
abort(403);
}
? 补充要点:本地开发与 Nginx 配置
开发时浏览器常通过 localhost 或 127.0.0.1 访问,此时 www.example.com 不生效。建议:
- 在
/etc/hosts添加:127.0.0.1 www.example.com - Nginx 配置中确保
server_name包含www.example.com,并禁止example.com或泛域名直接指向同一站点 - 若需同时支持
www和根域名,应显式列出两个Route::domain()分组,而非依赖通配符










