如何在Next.js 13的App目录中获取请求的子域名、域名等数据?
Next.js 13 App目录获取请求数据方法
针对你需要的子域名、域名、GET参数及Slug的获取,以下是具体实现方案:
1. 提取子域名与域名
在服务端组件或路由处理逻辑里,通过headers()获取请求的host字段,再用URL对象解析拆分:
import { headers } from 'next/headers'; function parseDomain() { const host = headers().get('host') || ''; // 用http://前缀确保URL解析正常 const url = new URL(`http://${host}`); const hostname = url.hostname; const parts = hostname.split('.'); let subdomain = ''; let mainDomain = ''; // 适配二级主域名场景(如my-domain.com) if (parts.length >= 2) { mainDomain = parts.slice(-2).join('.'); subdomain = parts.slice(0, -2).join('.'); } else { mainDomain = hostname; } return { subdomain, mainDomain }; }
调用这个函数就能得到示例中的subdomain: 'sub-domain'和mainDomain: 'my-domain.com'。
2. 获取GET参数(get_vars)
有两种实用方式:
方式一:直接通过Page组件props获取
在app/[slug]/page.tsx中,searchParams会自动传入组件:
export default function Page({ params, searchParams }: { params: { slug: string }; searchParams: { [key: string]: string | string[] | undefined }; }) { // 单个参数取值 const myVar = searchParams.my_var; // 结果为'1' const anotherVar = searchParams.another_var; // 结果为'2' // 遍历所有参数 for (const [key, value] of Object.entries(searchParams)) { console.log(`${key}: ${value}`); } return <div>页面内容</div>; }
方式二:用headers()结合URLSearchParams解析
如果是在其他服务端逻辑(如Server Components、Route Handlers)中:
import { headers } from 'next/headers'; function getQueryParams() { const requestUrl = headers().get('x-nextjs-url') || ''; const url = new URL(requestUrl, 'http://placeholder.com'); // 占位域名不影响查询串解析 const searchParams = new URLSearchParams(url.search); // 转换为键值对对象 const params: Record<string, string> = {}; searchParams.forEach((value, key) => { params[key] = value; }); return params; }
调用后会返回{ my_var: '1', another_var: '2' }。
3. Slug的获取(补充确认)
你通过app/[slug]/page.tsx的动态文件夹结构,已经可以在组件的params属性中直接拿到:
export default function Page({ params }: { params: { slug: string } }) { const slug = params.slug; // 结果为'my-slug' return <div>当前路径Slug: {slug}</div>; }
内容的提问来源于stack exchange,提问作者jon
相关产品推荐
相关产品推荐

