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

如何在Next.js中为每位注册用户分配独立二级域名

Next.js 实现用户独立二级域名方案

1. 前置域名与托管配置

  • 给主域名添加*泛解析记录,指向你的Next.js应用服务的节点IP,比如主域为example.com时,新增一条A记录,主机记录填*,值填写服务IP,TTL保持默认即可
  • 国内服务器部署需提前完成泛域名的备案流程
  • 若使用Vercel/Netlify等托管平台,需在自定义域名设置中添加*.example.com作为可绑定域名,同时开启泛域名支持

2. Next.js 核心逻辑实现

首先通过中间件拦截所有请求,解析二级域名提取用户名,重写到对应的用户资料路由,地址栏保持二级域名样式,用户无感知。

2.1 编写中间件逻辑

在项目根目录创建middleware.ts文件:

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

// 保留二级域名列表,避免和系统功能冲突,用户注册时也要校验禁止使用这些名称
const RESERVED_HOSTNAMES = new Set(['www', 'api', 'admin', 'app', 'mail'])

export function middleware(request: NextRequest) {
  const host = request.headers.get('host') || ''
  // 去掉端口号适配本地开发场景
  const [hostname] = host.split(':')
  const domainParts = hostname.split('.')

  // 判断是否为用户二级域名,普通后缀域名拆分后长度为3,多级后缀需调整对应长度
  if (domainParts.length === 3 && !RESERVED_HOSTNAMES.has(domainParts[0])) {
    const username = domainParts[0]
    // 内部重写到用户资料路由,不改变地址栏显示
    return NextResponse.rewrite(new URL(`/user/${username}`, request.url))
  }

  return NextResponse.next()
}

// 配置中间件匹配所有请求
export const config = {
  matcher: '/:path*',
}

2.2 用户资料页实现

App Router 模式

在app目录下创建app/user/[username]/page.tsx:

// app/user/[username]/page.tsx
async function UserProfilePage({ params }: { params: { username: string } }) {
  // 调用内部接口/数据库查询对应用户名的资料
  const userData = await fetch(`/api/getUserInfo?username=${params.username}`).then(res => res.json())
  
  if (!userData) {
    return <div>该用户不存在</div>
  }

  return (
    <div>
      <h1>{userData.nickname}的个人主页</h1>
      {/* 其余用户资料渲染逻辑 */}
    </div>
  )
}

export default UserProfilePage

Pages Router 模式

在pages目录下创建pages/user/[username].tsx:

// pages/user/[username].tsx
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'

export default function UserProfilePage() {
  const router = useRouter()
  const { username } = router.query
  const [userData, setUserData] = useState(null)

  useEffect(() => {
    if (!username) return
    fetch(`/api/getUserInfo?username=${username}`)
      .then(res => res.json())
      .then(data => setUserData(data))
  }, [username])

  if (!userData) return <div>加载中...</div>

  return (
    <div>
      <h1>{userData.nickname}的个人主页</h1>
      {/* 其余用户资料渲染逻辑 */}
    </div>
  )
}

3. 本地开发调试方法

修改本地hosts文件,添加测试映射规则,比如要测试john.example.com,就新增一行127.0.0.1 john.example.com,启动Next.js服务后直接访问john.example.com:3000即可验证效果。

内容的提问来源于stack exchange,提问作者Aflah Najeeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:09:04