结论先说:不要试图枚举所有参数组合,而要定义“有效地址集合”的判定规则,再用 canonical 把集合外的地址全部指向集合内的代表地址。规则成立的前提是参数对内容有可预期的语义;一旦参数可以任意拼接并改变页面主体内容,规则就会失效,此时应改为收敛参数入口而非依赖 canonical。
面对筛选、排序、分页、追踪等参数自由组合,常见两条路。
选择条件可以落到一个判断上:参数变化后,页面主体内容是否发生用户可感知的改变。若排序参数只改变顺序、不改变条目集合,通常可归一;若筛选参数改变条目集合,则该组合本身构成一个有效地址,不应被剥离。前者用规则收敛成本更低,后者更接近穷举,但可以用“维度组合”而非“全排列”来定义,避免组合爆炸。
两个地址返回的主体内容相同或近似,只是参数排列、追踪码、大小写或默认值不同,这类应视为同一有效地址。处理动作是让其中一个作为代表地址,其余输出指向它的 canonical。结果会直接影响下一步:如果这一层没做干净,后面任何抽样都会把等价地址误判成重复内容。
筛选后得到的条目集合是全集的真子集,且用户可能直接搜索并进入该子集。这类地址是否算“有效”,取决于它是否有独立检索需求。有,就保留为有效地址并自指 canonical;没有,就归一到上级集合。这里没有统一答案,需要按维度逐个判断,而不是给所有参数一刀切。
参数组合导致空结果、报错或回退到默认列表时,这类地址不应进入有效集合。处理动作是让它们返回明确状态或归一到默认地址,而不是让它们各自成为可索引页面。若放任不管,它们会稀释集合的边界,让后续判断失去基准。
假设某站允许参数任意拼接,且每个参数都会改变页面标题和正文片段,例如同时叠加地区、品类、价格区间和排序。此时“内容等价”和“内容子集”的边界不再稳定:两个看似只差排序的地址,可能因为其他参数联动而返回完全不同的条目。规则收敛在这种情况下会误判,把本应独立的地址归一掉。
反例的识别信号是:同一组参数在不同时间或不同入口下返回的主体内容不一致,或参数之间存在隐式依赖。遇到这种情况,正确的动作不是继续细化 canonical 规则,而是先收敛参数入口,限制可组合的维度数量,再回到规则收敛。这一步的结果决定了后续 canonical 是否有稳定对象可指向。
先取一组参数组合,按上面三层各标注一次,记录哪些被归入有效集合、哪些被排除。然后检查被排除的地址是否仍有真实入口流量;若有,说明判定层选错了,需要回到第二层重新判断。这个动作的产出是一份带条件的有效集合定义,而不是一张无限增长的地址清单。canonical 只是把这个定义表达出来的手段,定义本身才是要先确定的东西。