先不要改404模板,而是把“带参数的URL”当成独立输入来测:固定路径、逐个增减参数、保留或去掉编码字符,直到找出让异常出现的最小参数组合。只有能稳定复现那一组参数,后续判断是路由匹配、参数解析还是模板渲染的问题才有意义。
“部分页面正常”通常有两种含义,处理方向完全不同。
先记录这两项:HTTP状态码和最终响应体是否包含自定义404页面的标志性内容。如果状态码已经偏离,优先查服务器路由和重写规则;如果状态码是404但内容异常,优先查模板取值和参数拼接。把这两类混在一起测,会得到互相矛盾的结论。
假设你手上有一个异常URL,形如 /old-path?from=nav&id=42&utm_source=x。按下面顺序做减法,每一步只改一个变量:
/old-path,确认基础404页是否正常。/old-path?id=42,看异常是否出现。& 或 % 的值各测一次。这样做的结果会直接决定下一步:如果只有空值触发,问题多半在参数判空逻辑;如果只有含编码字符的值触发,问题多半在解码或转义环节;如果任意参数只要存在就触发,问题多半在“是否带查询串”的分支判断上。
找到最小复现条件后,常面临一个取舍:是在404模板里兼容异常参数,还是回到路由或重写层拦掉它。
选择改模板的条件:状态码正确、异常只表现为展示内容错乱,且异常参数属于历史遗留、无法从入口清除。代价是模板逻辑会变复杂,每新增一类参数都要再补分支,长期容易积累隐藏判断。
选择改路由或重写的条件:带参URL本就不该进入404流程,或状态码已经偏离。代价是改动影响面更大,必须回归测试正常404、正常200和重定向三类路径,避免把原本正常的页面一起拦掉。
判断依据可以看一个信号:把异常参数原样放到一个确定存在的正常页面上。如果正常页面也出错,问题在参数处理层,不该由404模板承担;如果只有不存在的路径才出错,才轮到404模板或404路由处理。
单次浏览器刷新可能受缓存、插件或历史重定向影响,不能作为唯一证据。从访问日志或监控里筛出同一路径的请求,比较三组记录:无参数请求、正常参数请求、异常参数请求。重点看请求行里的原始查询串、返回状态码和响应大小。
需要留意:某个参数组合的请求量归零,并不能单独证明修复正确。它也可能是入口链接被改、爬虫不再访问或缓存命中导致的。要结合状态码分布和响应体特征一起看,才能判断异常是否真的消失。
假设异常只在 ?id= 为空时出现,可以按这个顺序处理:
/not-exist?id=,确认异常稳定复现。?id=0、?id=abc、无参数三种情况,确认没有引入新的分支错误。如果第2步改动后异常消失,但第4步出现新的异常,说明判断条件写得过窄,应回到最小参数集重新划分边界,而不是继续叠加补丁。修复的终点不是“这一个URL正常”,而是同一类参数组合都能被同一套规则覆盖。