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

Next.js路由跳转重复拼接目录触发404错误的解决方法

问题根因

路径重复拼接触发404的核心原因是跳转时使用了不带前导斜杠的相对路径:

  • 在根路径/(首页)下触发跳转时,相对路径search/${searchTerm}会被拼接为/search/${searchTerm},符合跳转预期
  • 在已处于/search/xxx搜索结果页时,相对路径会基于当前所在路径层级做拼接,最终生成/search/search/${query}的错误路径,直接触发404响应

你当前编写的表单输入框值绑定、提交监听逻辑没有问题,故障点完全出在路由跳转的路径声明上。

修复方案

快速修复

给pathname值加上前导斜杠/,将路径声明为站点根路径下的绝对路径,路由跳转时就不会基于当前页面路径做相对拼接,直接解决重复片段问题:

const handleSubmit = (e) => {
  e.preventDefault();
  router.push({
    // 路径开头加/,声明为绝对路径
    pathname: `/search/${searchTerm}`,
  });

  setSearchTerm('');
};

规范写法(推荐)

不要手动硬拼接动态路由段、查询参数字符串,使用路由对象自带的参数传递能力,自动处理特殊字符转义,避免搜索词包含/、?、&等特殊字符时出现路径解析异常:

  • 如果你的搜索页路由是动态段结构/search/[keyword],对应写法:
const handleSubmit = (e) => {
  e.preventDefault();
  router.push({
    pathname: '/search/[keyword]',
    query: { keyword: searchTerm }
  });
  setSearchTerm('');
};
  • 如果你的搜索页是通过query参数传递搜索词(路径格式为/search?keyword=xxx),对应写法:
const handleSubmit = (e) => {
  e.preventDefault();
  router.push({
    pathname: '/search',
    query: { keyword: searchTerm }
  });
  setSearchTerm('');
};
开发建议
  • 站点内跨页面跳转优先使用/开头的绝对路径,规避相对路径在不同层级页面下的拼接逻辑差异
  • 涉及动态参数、查询参数的路由跳转,优先使用路由内置的参数传参能力,不要手动拼接路径字符串,减少异常场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:54:30