SvelteKit 2.61.0 参数页突然 404,检查首尾路由组
SvelteKit 2.61.0 首尾带 route group 的参数叶子页可能不匹配,表现为 404 或兄弟路由重定向。说明根路径正则误识别与 2.61.1 修复。
/123/news 能访问,/123 却在升级后变成 404,甚至被重定向到首页。页面还在路由清单里,参数 matcher 也存在时,可以检查路径是否以路由组开头、又以路由组结束。SvelteKit 2.61.0 有一条路由正则回归,会把这种完整路径错误地当成只有路由组的根路径。
已确认的实际结构包含多个 route group 与中间的参数段;2.60.1 能正确匹配,2.61.1 正式版已修复。不必等到目录丢失或 matcher 报错,页面就可能已经无法被选中。
不同兄弟路由会掩盖同一个匹配失败
下面是精简的目录关系,组名是示例,括号不会成为 URL 的实际片段:
src/routes/
└── (series)/
└── [id]/
└── (view)/
├── (meta)/
│ ├── +page.svelte
│ └── [[anything]]/
│ └── +page.server.ts
└── news/
└── +page.svelte
正常情况下,(meta)/+page.svelte 应匹配 /123,news 页匹配 /123/news。2.61.0 的回归可能让前者没有被选中。
如果同时存在 [[anything]] 这样的可选兄弟参数,它能接收空片段,便可能接管 /123。随后执行的 load 若会重定向,读者看到的是 302;没有这个兄弟路由,或兄弟使用必须提供片段的 [anything],则可能直接 404。302 的具体目的地来自应用逻辑,不是 SvelteKit 必定跳首页。
因此,先看失败请求实际匹配的 event.route.id、响应状态和 Location,再查叶子页有没有被选中。不要只在重定向函数里删除 return,强行让错误路由显示内容。
根路径识别用了过宽的匹配
受影响的根路由组识别规则会贪婪匹配从 /(group) 开始、到另一个 (group) 结束的字符串,把中间的参数段也吞进去。只想识别“整条路径只有一个组”的规则,错误命中了完整页面路径。
2.61.1 改为不跨越组名的右括号,并增加首尾路由组之间带参数的对照检查。这也说明,不能把故障条件写死成“必须有三个组”:三个组是具体案例的触发结构,源码修正针对更广的首尾组误识别。
先确认实际安装的 @sveltejs/kit 版本,以及项目目录是否确实符合这个形状。若版本和路由形状都不对应,继续检查 matcher、页面文件、base 路径和 hooks,不要给每个 404 都增加一个 catch-all。
升级路由实现,避免重排整个目录
在框架支持范围内采用包含修复的版本,保存依赖与锁文件,再由原启动入口重新生成框架产物。Svelte 编译器与 Kit 路由是不同的包,仅升级 svelte 不会修正这项 Kit 匹配规则。
临时减少一层 route group 在特定结构中可以避开错误,但它可能改变 layout 继承、错误边界或命名关系。已有项目不宜为了这条工具回归大幅搬动页面。若必须临时重排,应先记录受影响的 layout、load 和权限检查,不能只验证 URL 字符串没有变化。
验收至少覆盖裸参数页、明确的子页、未知子路径及根路径,分别查看 HTTP 响应和实际页面。带可选兄弟路由时,还要确认它只处理原本应该处理的地址。路由清单存在,只能证明构建发现了文件,不能替代运行时的匹配结果。


