唯一责任方应当落在“最终输出可抓取网址集合”的那个系统上,而不是落在写规则的人、写模板的人或提交站点地图的人身上。判断依据只有一条:当两套规则对同一网址给出不同结论时,谁有能力在不改代码的情况下改变最终输出,谁就是责任方。如果没有任何系统具备这种能力,说明责任被切碎了,需要先合并出口再谈频率。
多个系统生成网址规则时,冲突往往不是“谁写得对”,而是两种性质完全不同的问题。
这两种冲突的责任方不同。生成冲突的责任方是产出候选网址的那一层;执行冲突的责任方是决定“哪些候选进入对外可见集合”的那一层。把两者混在一起讨论,就会出现“每套规则都有人负责,但没人对最终结果负责”的局面。
当架构里有一个环节会把所有候选网址收敛成一份对外集合——例如服务端渲染时的路由解析、构建期的静态路径生成、或网关层的重写规则——责任方应当明确指定为这一层,而不是分散到上游。
选择它的理由是:只有这一层能同时看到全部候选,也只有它能在输出前做去重、归一化和取舍。上游系统各自只掌握局部信息,让它们互相协调的成本会随系统数量上升。
实施动作可以这样落地:在该出口层增加一个“网址决策记录”,对每个最终输出的网址记录三项内容——来源系统、被采纳或被丢弃、丢弃原因。这个动作的结果会直接影响下一步:如果丢弃原因集中在少数几类,说明是上游模板问题,修模板即可;如果原因分散且互相矛盾,说明出口层缺少明确的优先级定义,需要先补优先级而不是继续改上游。
需要说明的例外:出口层只做归一化、不做取舍时,它并不是真正的责任方。归一化把 /a?x=1 和 /a 合并,但如果两套系统分别生成 /a 和 /b 指向同一内容,归一化解决不了,责任仍在生成候选的那一层。
很多站点并没有统一出口层,网址由 CMS、前端路由、营销工具各自直接输出。这时不要试图临时搭一个出口层,而应按改动代价指定唯一责任方。
判断顺序是:先看哪个系统的规则改动不需要发版、不需要跨团队排期;再看哪个系统的规则覆盖的网址数量最多。两个条件同时满足的系统,就是当前的责任方。
这个选择有明确代价:责任方之外的系统会继续产出冲突网址,需要由责任方在输出侧做屏蔽或改写。屏蔽动作本身会带来新的风险——如果屏蔽方式依赖 robots.txt,要清楚抓取限制不等于索引移除,已被处理的网址仍可能出现在结果里;如果依赖 canonical,要清楚它只是提示,不是强制指令。因此这种方案适合冲突数量有限、且能持续监控的场景,不适合冲突持续新增的场景。
假设一个站点有 5 万条内容,其中 800 条由营销工具生成的落地页与 CMS 页面指向同一主体内容。若营销工具改动需要跨团队排期两周,而 CMS 的模板改动当天可上线,那么把责任方定在 CMS 侧、由它在输出时对重叠网址做处理,是当期成本更低的选择。这个数字只用于说明比较方法,不代表任何实际站点的规模。
只指定责任方而不指定边界,冲突会以另一种形式回来。边界至少要写清三件事:
一个可执行的动作是:把责任方的输出结果与各上游系统的候选列表做定期比对,比对结果只用于回答一个问题——是否有候选网址绕过了责任方。如果有,先修路径,不要先调频率。因为绕过路径存在时,任何频率调整都只是在处理症状。
有两种情况需要先停一步。第一种是冲突网址数量极少且不再增长,这时定责任方的管理成本高于冲突本身的处理成本,直接逐条处理更实际。第二种是站点正在做架构迁移,出口层即将变化,此时指定的责任方可能几周后就失效,应当把决定推迟到迁移方案确定之后。
另外要避免一个常见误判:把抓取量或收录量的变化直接归因于责任方是否明确。抓取量下降可能来自服务器响应、robots 规则调整、外链变化或搜索引擎自身的调度,这些都与责任方定义无关。责任方定义解决的是“冲突时听谁的”,不是“收录频率应该多高”。两者不要混在一个判断里。