通过 Next.js 中间件(Middleware)根据请求的 Host 头动态控制页面可见性,可实现同一应用在多个域名下展示不同路由(如仅在 something.com 显示 /about,而在 somethingelse.com 中隐藏或重定向)。
通过 next.js 中间件(middleware)根据请求的 host 头动态控制页面可见性,可实现同一应用在多个域名下展示不同路由(如仅在 `something.com` 显示 `/about`,而在 `somethingelse.com` 中隐藏或重定向)。
在 Next.js 13+(App Router)中,借助中间件可于请求到达服务端组件前进行轻量级路由拦截与响应干预。该能力特别适用于多域名共用同一代码库的场景——例如主站 something.com 需完整功能(含 /about 页面),而落地页 somethingelse.com 仅需登录、首页等核心能力,需屏蔽非必要路由。
中间件运行在边缘(Edge Runtime),可通过 request.headers.get('host') 获取当前请求域名,并结合 request.nextUrl.pathname 判断路径,从而决定是否重定向、返回 404 或修改请求。
以下是一个生产就绪的示例:
// src/middleware.tsimport { NextResponse } from 'next/server';import type { NextRequest } from 'next/server';export function middleware(request: NextRequest) { const host = request.headers.get('host')?.toLowerCase() || ''; const pathname = request.nextUrl.pathname; // 定义域名白名单策略 const isMainDomain = host === 'something.com' || host.endsWith('.something.com'); const isLandingDomain = host === 'somethingelse.com' || host.endsWith('.somethingelse.com'); // /about 仅对主域名开放,其他域名重定向至首页 if (pathname.startsWith('/about')) { if (!isMainDomain) { return NextResponse.redirect(new URL('/', request.url)); } } // 可扩展:/admin 仅限内部域名访问 if (pathname.startsWith('/admin') && !host.includes('internal.')) { return NextResponse.rewrite(new URL('/404', request.url)); } // 允许所有其他请求继续 return NextResponse.next();}// 指定中间件生效路径(支持 glob 匹配)export const config = { matcher: [ '/about/:path*', '/admin/:path*', // 注意:若需拦截根路径或动态路由,也应显式列出 ],};
通过中间件驱动的域名级路由治理,你无需维护多套代码或部署多个实例,即可安全、灵活地复用核心逻辑(如登录态、API 调用),同时满足不同品牌站点的业务隔离需求。