当筛选参数、排序字段、会话标识可以自由拼接时,死链查询面对的往往不是一批固定网址,而是一个几乎无限的地址空间。此时“有效地址集合”不能理解为全部可返回 200 的地址,而应定义为:在业务上确认有意义、在抓取上允许访问、在索引上值得保留的那一层地址模板及其允许的参数组合。其余组合即使能打开,也应视为无效或低价值地址,交给抓取规则和链接治理去约束,而不是逐条查询。
直觉上,死链查询是把站点所有地址跑一遍,找出返回错误的那部分。但在参数可自由组合的站点上,跑出来的结果常常相反:错误地址数量随抓取规模线性甚至指数上升,真正的业务问题却始终是同一小批模板。比如一个商品列表页,若允许 color、size、sort、page 任意组合,理论上可生成的地址远超实际商品数量。此时继续扩大查询范围,只会把同一类无效组合重复计入,无法帮助判断哪些地址该保留、哪些该清理。
更麻烦的是,某些参数组合会返回 200,但页面内容与主地址高度重复,或者为空结果页。这类地址在死链查询里不会报错,却会稀释有效地址集合的边界,让后续的清理决策失去依据。
一种成立的观点是:有效地址集合的边界来自业务语义,而不是 HTTP 状态。商品详情页、分类页、搜索结果页、文章页各自对应一个模板,模板决定哪些参数是必需的、哪些是可选的、哪些组合在业务上根本不产生独立内容。按这个思路,死链查询应先确定模板清单,再在每个模板内枚举允许的参数取值,得到的是有限集合。
这个解释能成立的条件是:团队能说清每个模板的业务含义,并且参数取值有明确来源,例如分类 ID、品牌 ID 来自后台数据,而不是用户可随意输入的任意字符串。若参数值本身来自外部输入或可被无限构造,模板法就只能约束参数名,无法约束参数值。
另一种观点是:业务上认为有意义的地址,未必真的被访问和保留。有效集合应结合抓取日志与索引状态来判断——被稳定抓取、且没有被明确排除的地址,才进入候选集合;长期不被抓取或被抓取后不保留的地址,即使业务上有意义,也应先视为待确认,而不是直接纳入死链查询的比对基准。
这个解释成立的条件是:站点有可用的抓取记录,并且能区分“未被发现”“被发现但未抓取”“被抓取但未保留”这几种状态。如果缺乏这些记录,就只能退回模板法,不能凭空推断抓取偏好。
要判断该采用哪种定义,可以观察死链查询结果中错误地址的分布。若错误集中在少数参数名或少数取值上,例如某个排序参数的所有取值都异常,更支持模板法——问题出在模板定义与实现不一致。若错误分散在大量随机组合上,且这些组合大多从未出现在抓取记录里,更支持抓取反馈法——问题出在地址空间没有被有效约束。
一个可执行的区分动作是:先按参数名分组统计错误数量,再按参数值来源分组统计。假设某站点有 10 个可选参数,每个参数平均 20 个取值,全组合数量巨大;但按参数名分组后发现,80% 的错误来自其中 2 个参数。这个结果说明,优先收紧这 2 个参数的允许范围,比继续扩大全量查询更能收敛问题。该动作的结果会直接影响下一步:若错误随参数名集中,就进入模板修正;若错误随取值来源分散,就进入抓取规则和链接生成逻辑的检查。
无论采用哪种解释,最终都需要把有效地址集合写成可复核的规则,而不是一份不断增长的网址清单。可以按以下顺序处理:
需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。因此,把某类参数组合写进排除规则,只能减少被抓取和暴露的机会,不能替代对有效地址集合本身的定义。若站点同时存在多个搜索引擎来源,支持情况须分别核查,不能以单一来源的表现推断全部。
假设某站点商品列表页允许 page、sort、brand、price_min、price_max 五个参数,每个参数有若干取值。若不加约束,地址数量会迅速膨胀。按模板法,可规定只有 page 与 brand 允许参与索引,sort 仅允许默认值,价格区间不生成独立地址。此时有效地址集合从近乎无限收缩为“品牌 × 页码”的有限组合。死链查询只需在这个有限集合内比对,范围外的组合即使返回 200,也不进入有效集合。这个例子的数字仅用于说明比较方法,不代表任何实际站点的规模。
定义有效地址集合的关键,不是把能打开的地址都算进来,而是先确定哪些地址值得存在、值得被抓取、值得被保留,再用死链查询去验证这个边界是否被实现正确执行。