有效地址集合不能靠穷举参数组合来定义,而要先定义地址的规范化规则和等价边界:同一台服务器在多个参数值下返回同一资源时,这些地址应被视为同一个有效地址的变体,而不是集合中的新成员。检测的目标因此从“找出所有可访问的URL”转为“确认每个唯一资源至少有一个可代表它的地址”,并让不同角色对“有效”的判断落到同一份可核对的清单上。
假设有一个商品筛选页,参数包括分类、排序、分页、每页数量、展示模式。运维认为只要返回200就是有效地址;SEO认为参数顺序不同、默认值显式写出,都会产生重复内容;产品认为每个筛选组合都应被抓取,否则用户搜不到长尾结果。三方各拿一份清单,数量相差很大,争论谁对谁错没有意义,因为“有效”没有被定义过。下面把这个分歧转成可以核对的项目。
要让集合可核对,需要同时满足三个条件,缺一个都会让参数组合重新膨胀。
按这三个条件,集合的大小由“唯一内容”决定,而不是由参数取值的笛卡尔积决定。参数组合继续增长,集合可以保持稳定。
把定义写成清单,分歧才会变成可验证的条目。清单至少包含:规范化规则、每个成员的规范地址、允许的变体参数、以及变体应指向的规范地址。三个角色分别核对同一份清单的不同列——运维核对变体是否真实返回,SEO核对规范指向是否唯一,产品核对长尾内容是否被某个成员覆盖。
一个可执行的动作是:先按规范化规则生成候选地址,再对候选地址做一次实际请求,记录状态码和主体内容的指纹。如果两个候选地址的指纹相同,就把它们合并为一个成员,并指定其中先出现的那个为规范地址。这一步的结果直接决定下一步:合并后仍为空的筛选组合,说明该内容没有被任何成员覆盖,需要新增成员或调整规范化规则;合并后数量没有下降,说明规范化规则没有生效,应先修规则而不是继续扫地址。
假设排序参数有升序和降序两个值,其余条件相同。若检测发现两个地址返回的主体内容只是顺序不同、条目集合一致,按“内容可区分”这一条,它们属于同一个成员,降序地址作为变体指向升序规范地址。若条目集合确实不同,则它们是两个成员。这个判断不依赖参数个数,只依赖内容指纹的比较结果。
当检测显示候选地址数量突然上升,先不要归因于服务器故障。合理的解释至少有三种:规范化规则没有覆盖新加入的参数;内容指纹的计算方式把无关差异也算进去;或者确实新增了可区分的内容。区分方法是抽样比较指纹:指纹相同而地址不同,属于前两种;指纹不同,才属于第三种。
同样,某个地址返回404或超时,不能单独证明它应被移出集合。它可能只是暂时不可达,也可能是该成员本就不该存在。需要结合它是否属于某个成员的变体来判断:如果是变体,应检查规范地址是否正常;如果它本身是规范地址,才需要重新评估该成员是否成立。
另外,抓取限制与索引移除是两件事。用robots.txt阻止抓取,不等于该地址会从索引中消失;站点地图列出地址,也不保证被收录。检测清单里应把“可抓取”“可索引”“有代表地址”分开记录,避免用一个状态推断另一个状态。
有效地址集合定义完成后,它应成为下一次检测的输入,而不是检测的产物。下一次检测先读入规范地址清单和变体映射,再验证每个映射是否仍然成立。成立的条件是:变体返回的内容指纹与规范地址一致,且规范地址本身可访问。任一条件不成立,就产生一个待核对项,由对应角色确认是规则需要更新,还是内容确实发生了变化。这样,参数组合的增长不会再自动转化为集合的增长,分歧也有了共同的核对对象。