Next.js 13动态路由自动追加查询参数问题求助
我用Next.js 13的Pages目录开发项目,部署在Vercel上,配置了[category]/[slug].tsx和popular/[slug].tsx两个动态路由页面,并且都设置了getStaticPaths和getStaticProps。但现在遇到异常:
- 访问
/someCategoryName/someSlugName时,会自动重定向到/someCategoryName/someSlugName?category=someCategoryName&slug=someSlugName - 访问
/popular/someSlugName时,会重定向到/popular/someSlugName?slug=someSlugName
代码里没配置这类重定向,也没通过useRouter做跳转,中间件只有域名对应页面目录的重写逻辑,和查询参数追加无关。以下是可能的排查方向:
检查Vercel的部署配置
Vercel默认的尾随斜杠处理或自动重定向规则可能导致这个问题。去Vercel项目设置里查看Redirects和Trailing Slash选项,确认有没有开启自动添加尾随斜杠,或者存在未注意到的隐含重定向规则。排查getStaticPaths的fallback设置
如果getStaticPaths里的fallback设为true或blocking,当访问未预生成的路径时,服务端生成页面的过程可能出现参数传递异常。如果已预生成的路径也有这个问题,那大概率不是这个原因,但还是可以检查fallback值和生成的路径列表是否正确。清理路由缓存与检查路由冲突
可能是旧的路由配置缓存导致的,比如之前有过基于查询参数的路由逻辑,部署后Vercel缓存没清。可以在Vercel重新部署时勾选“清除缓存”,本地开发则删除.next目录后重新构建。另外,检查项目里是否有其他页面文件(比如popular.tsx、[category].tsx)和动态路由产生匹配冲突,导致Next.js错误地把动态参数转为查询参数。复查中间件的重写逻辑
虽然你说中间件只有域名重写,但可能重写规则的正则或路径处理有漏洞,比如不小心把原始路由参数追加到了查询串里。仔细检查NextResponse.rewrite的调用代码,确认路径处理没有额外添加参数。尝试升级/降级Next.js版本
Next.js 13的Pages目录部分版本存在动态路由解析的已知bug,尤其是和getStaticProps/getStaticPaths结合使用时。可以尝试升级到最新稳定版,或者降级到13.4.x这类公认稳定的版本,看问题是否消失。
内容的提问来源于stack exchange,提问作者ira bolyukh

