问题描述
在 Next.js 15 应用中,用户点击热门经验列表中的链接时,跳转到 `/experience/[id]` 路径后显示404错误。同时在构建时出现路由冲突错误:
```
Build Error: You cannot have two parallel pages that resolve to the same path.
Please check /(search)/experience/[id]/page and /experience/[id]/page.
```
具体表现:
1. 链接生成正确:`href="/experience/cf3d9a04-6bbd-4cf5-af70-236dc435244e"`
2. 点击后显示404页面
3. 构建失败,提示路由冲突
根本原因
**主要原因**:Next.js 不允许两个不同的页面路由解析到相同的路径
项目中同时存在两个路由文件:
- `web/src/app/(search)/experience/[id]/page.tsx` - 路由组内的路由
- `web/src/app/experience/[id]/page.tsx` - 顶级路由
在 Next.js 的路由系统中:
- `(search)` 是一个路由组(Route Group),用于组织路由但不影响URL路径
- 路由组内的 `(search)/experience/[id]/page.tsx` 解析为 `/experience/[id]`
- 顶级的 `experience/[id]/page.tsx` 也解析为 `/experience/[id]`
- 两者产生路径冲突,导致构建失败和404错误
**次要原因**:项目中的链接指向错误
部分代码中链接指向 `/search/experience/[id]`,但实际应该指向 `/experience/[id]`:
```tsx
// 错误的链接
<Link href={`/search/experience/${experience.id}`}>
// 正确的链接
<Link href={`/experience/${experience.id}`}>
```
解决方案
### 步骤1:删除冲突的路由文件
删除路由组内的冲突文件,保留顶级路由:
```bash
# 删除
web/src/app/(search)/experience/[id]/page.tsx
# 保留
web/src/app/experience/[id]/page.tsx
```
### 步骤2:修复所有错误的链接指向
修改所有相关组件的链接路径:
**用户仪表盘页面** (`web/src/app/admin/user-dashboard/page.tsx`):
```tsx
// 修改前
<Link href={`/search/experience/${experience.id}`}>
// 修改后
<Link href={`/experience/${experience.id}`}>
```
**经验列表组件** (`web/src/components/experience/ExperienceList.tsx`):
```tsx
// 修改前
<Link href={`/search/experience/${experience.id}`}>
// 修改后
<Link href={`/experience/${experience.id}`}>
```
### 步骤3:验证路由结构
确保最终只有一个正确的路由文件:
```
web/src/app/
└── experience/
└── [id]/
└── page.tsx // ✅ 唯一的详情页路由
```
### 步骤4:重新构建并测试
```bash
# 清理构建缓存
npm run build
# 启动开发服务器
npm run dev
```
背景信息
**技术栈**:
- Next.js 15.5.6 (App Router)
- React
- TypeScript
- Node.js v22.13.0
**项目结构**:
- 使用 Next.js App Router 架构
- 采用路由组 (Route Groups) 组织路由
- 多个组件共享经验详情页链接
**相关文件**:
- `web/src/app/experience/[id]/page.tsx` - 经验详情页面
- `web/src/app/admin/user-dashboard/page.tsx` - 用户仪表盘
- `web/src/components/experience/ExperienceList.tsx` - 经验列表组件