先别急着把整站重新跑一遍。正确做法是固定一个能稳定复现的参数组合,再逐项替换参数值、请求头、来源路径和登录状态,观察异常在哪一步消失。只要异常随某个变量一起出现或消失,复现条件就缩小了一圈;如果换掉所有变量后异常仍在,问题多半不在参数本身,而在处理该参数的规则或数据上。
假设你有一个商品筛选页 /list?cat=1&sort=new&page=2,不带参数时返回 200,带 page=2 时返回 404,但同站另一个栏目同样的参数结构却正常。此时不要先怀疑“死链检测工具漏报”,而要把它当成一个可复现的请求来对待:记录完整 URL、请求方法、必要的 Cookie 或登录态、来源页,以及返回的状态码和响应体开头。这些字段是后面逐项替换的基准。
这一步的实际动作是把“异常页面”改写成“异常请求”。结果会直接影响下一步:如果同一 URL 用不同请求头得到不同状态码,排查方向就转向服务端的内容协商或缓存;如果无论怎么请求都稳定 404,才值得去看链接本身和站内引用。
缩小复现条件的核心是单变量法:每次只改一个东西,其余保持不变。可以按下面的顺序试,每一步都记录状态码是否变化。
page=2 换成 page=1、page=3,看是特定值异常还是整个参数异常。sort=new 去掉、换位置,看是否只有多参数组合才触发。如果异常只在“带 Referer 且已登录”时出现,那它很可能不是死链,而是权限或反爬逻辑返回了错误状态码。这个区分很关键:404 不一定代表资源不存在,也可能是服务端对特定请求条件给出的伪装响应。把它当成死链去清理,会误删正常入口。
缩小条件之后,还要判断问题落在哪一层,因为不同层的处理方式完全不同。
只有当前三层都被排除,才值得怀疑检测工具本身。反过来,如果一上来就归因于工具,就会跳过真正需要修的路由或数据问题。
假设某站点在死链检测报告里出现 40 条 404,其中 38 条集中在同一个带分页参数的列表模板,另外 2 条分散在其他页面。此时合理的做法不是把 40 条一起提交修复,而是先取那 38 条中的一条做单变量测试。
如果测试发现 page=1 正常、page=2 异常,而 page=2 对应的数据确实为空,那么这 38 条属于数据层,处理方式是补数据或让空页返回正常状态而非 404。如果测试发现只要带该参数就异常,与页码无关,那属于路由层,应检查参数解析规则。两种结论对应的修复动作不同,扩大的检测范围也不同:前者只需复查同类列表页,后者需要复查所有使用该参数模板的页面。
这个情境是假设,用于说明比较方法,不代表任何真实站点的结果。它的价值在于:先用一条样本确定层级,再决定是否把检测铺到全站,比直接全量重扫更省时间,也更不容易误判。
单样本成立不等于全站成立。以下几点是常见边界。
把复现条件缩到最小之后,下一步动作应当是:用这个条件去反查站内还有多少页面共享同一模板、同一参数规则或同一数据来源,再决定修复范围和复检范围。这样得到的死链清单才有明确边界,而不是一份无法解释的异常列表。