当筛选、排序、分页、追踪等参数可以自由组合时,URL空间会趋于无限,逐条检查既不可能也没有意义。可行的做法是:先为这类站点定义“有效地址集合”,只把集合内的地址纳入死链检查;集合外的组合视为无效变体,用规范化、抓取规则和监控边界处理,而不是逐个修复。
定义有效集合之前,要区分两种结构,因为两者的取舍完全不同。
判断依据不是参数数量,而是参数取值是否封闭。如果某个参数能接受用户输入或外部拼接的值,它就不属于可枚举范围,应归入组合爆炸型处理。
当所有参数取值都来自固定列表,有效地址集合就是这些取值的笛卡尔积。此时的动作是:
这个动作的结果会直接影响下一步:如果枚举出的地址中有大量本来就不该存在的组合,说明有效集合的定义过宽,应先在代码层限制参数组合,再重新枚举,而不是把死链一条条重定向。
组合爆炸型站点无法枚举,只能定义“什么算有效地址”。常见边界包括:
一个假设例子:某列表页有颜色、尺寸、排序、页码四个参数,各自取值 10、8、3、50。理论组合超过一万种,但业务上只有“单筛选 + 单排序 + 前 10 页”被视为有效。此时有效集合约为 10×3×10 加上尺寸维度的同类组合,其余组合统一返回 404 或跳转到无参数列表页。
实施动作是先写出这套规则,再用它过滤爬虫抓到的地址:集合内的地址进入死链检查队列,集合外的地址只统计数量、不逐条修复。这样做的结果是检查范围从“无限”收敛到可维护的规模,后续新增参数时也只需更新规则,而不是重建清单。
有效集合的定义必须和规范化保持一致,否则会出现“检查通过但实际重复”的假象。做法是:
rel="canonical" 或 301 指向集合内的代表地址。需要注意,规范化只解决“同一内容多地址”的问题,不能替代死链检查。被规范化的地址如果返回 404,仍然是一次真实的访问失败,只是它不属于有效集合,可以按无效变体处理。
规则化定义会漏掉几类地址,需要单独纳入检查:
另外要明确:站点地图只表达你希望被发现的地址,不保证被收录;robots.txt 的抓取限制也不等于可靠的索引移除。因此有效集合的边界应通过规范化、状态码和抓取规则共同表达,而不是只依赖其中一项。
按这个流程走完,参数增长就不再是死链检查的障碍:需要维护的是一套可更新的规则和几张例外表,而不是一个永远追不上的地址清单。当规则或例外表发生变化时,重新跑一次过滤即可,检查范围始终可控。