先给结论:不要试图枚举所有参数组合,而是以“规范地址”为唯一有效地址,把其余组合定义为可折叠、可丢弃或可拒绝的变体。具体做法是先用你手上的一份参数清单,按“是否改变页面核心内容”分成三组,再为每组指定一个动作,最后用抽样验证动作是否按预期生效。下面用一个假设的筛选页例子走完整流程。
把页面用到的参数逐个列出来,只问一个问题:去掉或改变它,用户看到的主体内容是否发生实质变化。据此分成三类。
这一步的产出是一张三列清单,而不是一段规则。清单是后续所有动作的依据,规则只是清单的机器可读表达。
三类参数的处置方式不同,混在一起处理就会在规模化后出现例外。
边界在于:如果某个“展示修饰型”参数实际上会切换内容集合,例如排序变化导致首屏商品完全不同,那么它就不再是纯修饰,需要重新归类。归类错误是规模化后出现例外的最常见原因。
假设你手上有一个商品列表页,地址形如 /list?cat=3&page=2&sort=price&view=grid&ref=ad。按上一步归类:cat 和 page 属于内容决定型;sort 和 view 属于展示修饰型;ref 属于无关型。
接下来做三件事。第一,为 cat 与 page 的合法取值设定上限,例如分页最多到第 N 页,超出后返回与最后一页一致的内容并标记规范地址。第二,为 sort 与 view 指定默认组合作为规范地址,其余组合在页面头部输出指向默认组合的规范链接。第三,在站内链接中不生成 ref,并在服务端忽略该参数。
动作完成后,从每个类别各抽若干地址,检查返回内容、规范链接指向和站内链接是否一致。抽样结果会直接影响下一步:如果发现展示修饰型参数改变了主体内容,就把它移回内容决定型;如果无关型参数仍产生独立响应,就回到忽略逻辑排查。
个别样本表现正常,往往掩盖了两类例外。一类是参数组合的爆炸发生在内容决定型参数上,例如多条件筛选,每个条件都真实改变结果集。这时有效地址集合本身会接近无限,继续用规范链接折叠并不合适,更实际的做法是限制可被抓取的组合范围,把长尾组合留给站内搜索,并确保搜索结果页不被当作独立内容页对待。
另一类是参数值本身无边界,例如任意关键词或任意日期区间。此时应把无边界参数排除在有效地址集合之外,而不是试图为每个值生成规范地址。
判断依据不是“样本页面是否正常”,而是“该参数是否存在可枚举的有限取值”。有限且改变内容,保留;无限且改变内容,限制或排除;不改变内容,折叠或丢弃。这个判断标准比任何单条规则都更能解释规模化后的例外。
最终的有效地址集合可以写成一句话:由内容决定型参数的有限合法取值组合构成,其余组合一律视为变体,不进入站点地图,不作为站内链接目标,并通过规范链接或服务端忽略指向唯一规范地址。站点地图不保证收录,它只是提交候选地址的渠道,因此不要把它当作有效地址集合的验证手段。
可复查意味着每个季度或每次参数变更后,重新核对三列清单和抽样结果。如果某次抽样中展示修饰型参数再次改变主体内容,就回到归类步骤重做,而不是在现有规则上打补丁。这一步的动作和结果,决定了下一轮是继续维护现有定义,还是重新划定有效地址集合的边界。