DEBUG.WIKI
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

Fastify 大小写不敏感路由正常,404 却跑到根处理器

Fastify 5.12.7 正常路由与独立 404 路由器未共享全部匹配选项,可能跳过插件 not-found handler。核对大小写、重复斜杠及参数边界,审查局部补传并验证封装钩子。

/API/known 能进入 /api 插件,/API/missing 却跑到根级 404,插件自己的 not-found handler 与钩子没有执行。Fastify 已设置 caseSensitive: false 时,不能仅因正常路由匹配成功,就认定 404 也采用相同规则。

5.12.7 使用独立路由器查找封装范围内的 404。初始化时只传入少量选项,没有把大小写、重复斜杠、分号分隔和最大参数长度等配置一起传入。这使正常路由与 404 前缀判断可能采用不同条件。

用正常命中与同范围缺失路径成对检查

保留大小写不同的已存在路径和缺失路径,分别记录实际 handler。重复斜杠、分号及长参数需要各自的配置样本,不能把所有异常都描述为大小写问题。

这里不是找不到目标资源就应该返回 200;问题在于哪个封装实例负责返回 404,以及它的哪些钩子被执行。仅把根级错误消息改成插件的文案,不会自动补回插件的鉴权、日志或上下文。

修正独立 404 路由器的配置边界

需要保留这些匹配选项的工程,可以在锁定的 5.12.7 依赖补丁中审查 fourOhFour 的 FindMyWay 初始化。应把相关选项显式传入,同时保留原来的错误与默认路由回调:

const router = FindMyWay({
  caseSensitive: options.routerOptions.caseSensitive,
  ignoreDuplicateSlashes: options.routerOptions.ignoreDuplicateSlashes,
  useSemicolonDelimiter: options.routerOptions.useSemicolonDelimiter,
  maxParamLength: options.routerOptions.maxParamLength,
  onBadUrl: options.routerOptions.onBadUrl,
  onMaxParamLength: options.routerOptions.onMaxParamLength,
  defaultRoute: fourOhFourFallBack,
});

这是框架内部对应位置的补丁片段,不是业务 app 新建另一个路由器的配置。通过已有的包补丁与代码审查流程维护,并核对该版 FindMyWay 接受的选项。不要把整个 options 对象无差别展开,覆盖内部回调或带入无关配置。

改动前保存锁文件与原包来源。撤回时移除局部补丁、按原锁恢复依赖,再检查正常命中和 404;正式框架更新确实覆盖这一分支以后,再评估移除临时补丁。5.12.7 本身并不包含上面这组补传配置。

不要在全局把请求地址转成小写

路径参数可能区分大小写,查询值和百分号编码也有自己的含义。为了让 404 前缀匹配而重写整个 URL,可能把资源或租户映射到另一个值。

无法立即改依赖时,至少让根级 404 保持必要的公共安全与错误处理,并明确插件范围尚未覆盖;不要据此宣称封装钩子已经恢复。真实修复后,回查插件与根的 handler、鉴权、日志及正常路由,分别覆盖原来的四类选项。错误体看起来一样,不足以证明选中了正确上下文。