当筛选参数、排序参数、会话参数可以自由拼接时,URL 空间在理论上是无限的,死链检测不可能穷举。可行的做法是放弃“枚举全部地址”,改为定义“有效地址集合”:先确定哪些参数组合在业务上真实存在,再把这个集合作为检测与监控的边界。集合之外的一律按无效处理,而不是逐个探测。
两种参数结构对应两种完全不同的集合定义方式,选错会让检测量级差出几个数量级。
枚举型参数指每个参数的取值来自有限集合,例如分类、页码、排序方式。这类参数的组合数可以计算,有效集合就是各参数合法取值的笛卡尔积再减去业务上不成立的组合。此时可以直接生成完整地址清单,逐个检测,成本可控。
自由拼接型参数指取值来自用户输入、时间戳、追踪标识或任意字符串。这类参数没有上界,任何“生成全部组合”的思路都会失败。有效集合必须由白名单定义:只有被业务承认的参数名和取值格式才算有效,其余一律归入无效。
黑名单的问题是它永远追不上新出现的参数。只要有人拼出一个新参数名,黑名单就漏掉一个。白名单反过来:不在名单里的参数组合直接判定为无效地址,检测工具只需验证白名单内的组合是否可访问。
实施动作分三步。第一步,从访问日志或站点地图中提取实际被请求过的参数名,按出现频次排序,人工确认哪些是业务参数、哪些是追踪或垃圾参数。第二步,为每个业务参数写明合法取值格式,例如 page 只允许正整数且不超过某个上限,sort 只允许几个固定值。第三步,把这份规则写进检测脚本的地址生成器,只生成符合规则的组合。
这个动作直接决定下一步:生成器输出的地址数量会从“无法估计”变成“可以列清”。如果输出量仍然巨大,说明某个参数的取值上限设得过宽,需要回到第二步收紧,而不是扩大检测资源。
假设某列表页有两个参数 category 和 page。category 有 20 个合法值,page 在业务上最多到 50。有效集合是 20×50=1000 个地址,逐个检测完全可行。
如果同一页面还接受一个自由输入的 q 参数,那么“任意 category×任意 page×任意 q”的组合没有上界。此时正确做法不是去检测所有 q,而是规定:带 q 的地址只在搜索结果页有效,且 q 不参与死链检测的地址生成,只检测无 q 的 1000 个基础地址。这样集合重新变得有限。
个别样本检测通过、规模化后却出现大量 404,常见原因不是检测方法错了,而是有效集合的定义包含了业务上并不存在的组合。例如把 page 的上限设成 100,但业务上超过第 50 页就返回空结果或 404。这些地址本就不该被当作有效地址。
处理方式是回看例外地址的参数取值,判断它是否落在业务承认的范围内。如果不在,收紧白名单即可,不需要为它单独修复。如果在范围内却返回错误,那才是真正的死链,需要进入修复流程。
需要注意,抓取限制、站点地图提交和索引状态都不能替代这种集合定义。robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;请求量或抓取量下降也不能单独证明集合定义正确,它还可能来自流量波动、日志采样变化或抓取预算调整。要区分这些解释,需要结合参数取值分布一起看,而不是只看总量。
有效集合不应只存在于检测脚本里,而应写成独立的规则文件,包含参数名、取值格式、上限和例外说明。每次检测都以该文件为准,规则变更时留下记录。这样当例外再次出现时,能快速判断是规则过宽、规则过窄,还是真实死链,从而决定下一步是改规则还是改页面。