You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:55:41