唯一责任方应当定义为“最终决定写入站点地图或提交清单的那个系统”,而不是生成网址最多的系统。具体做法是:先确定网址的权威来源,再让其他系统只输出候选集,由权威来源做合并、去重和准入判断。若两个系统都能直接写入,就必须选一个作为主写入方,另一个降级为只读输入。
多个系统同时生成网址,常见于内容库、路由层、分页组件和站内搜索各自拼接链接。此时要区分“生成”和“决定”:生成只是产出字符串,决定意味着某条网址是否进入可提交状态。唯一责任方应掌握三件事:命名规范、参数白名单、失效判定。只要这三件事分散在两个系统里,就会出现同一路径两种写法,例如一个输出带尾斜杠,另一个不带,提交时被当成两条。
判断依据可以看冲突发生的位置。如果冲突只在展示层出现,而存储层只有一种规范形式,责任方应放在存储层出口;如果冲突在存储层就存在,说明写入阶段缺少约束,责任方必须上移到写入入口,而不是在下游做清洗。这个顺序决定了后续动作是改输出还是改模型。
当站点地图生成器只接受一个数据源时,把这个数据源定为唯一责任方,其他系统通过接口或文件提供候选网址。责任方的动作是:对候选集做规范化、去重、状态校验,再决定是否写入。结果会直接影响下一步——如果候选集中出现大量重定向或 404,说明上游仍在生成已废弃规则,此时应回到上游修规则,而不是在责任方里加例外。
这种情况下不能靠“谁先写谁负责”,而要指定一个主写入方,其余系统改为只读。主写入方负责最终清单,其他系统的输出只作为输入。若无法立即改造,至少给非主写入方加一道准入标记,让责任方在合并时能识别并丢弃重复项。例外是:如果某个系统负责的是独立子域或独立语言站,且两套规则不会交叉,可以保留两个责任方,但必须明确各自的路径前缀边界。
把责任落到可检查的规则上,而不是口头约定。规则表至少包含:路径模式、参数处理方式、尾斜杠策略、大小写策略、失效状态码、是否允许进入提交清单。每个字段只能有一个系统拥有修改权。假设某站点把分页参数 ?page= 同时交给内容库和路由层处理,内容库输出 ?page=2,路由层输出 ?page=2&sort=default。若责任方是内容库,路由层就必须把 sort=default 视为默认值并剥离;若责任方是路由层,内容库就不能自行拼接分页参数。这个假设说明:责任方不同,剥离动作的位置也不同。
动作完成后,观察提交清单中同一路径是否只剩一种形式。如果仍然出现两种,说明还有第三个写入点未被纳入规则表,下一步应排查日志中的写入来源,而不是继续在责任方内部加判断。
有些现象不能单独证明责任方选错了。提交量下降可能来自上游内容减少、抓取预算变化或站点地图拆分,不一定等于规则冲突。抓取量归零也可能只是 robots.txt 临时限制或服务器返回异常,需要结合状态码和访问日志判断。robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS 不保证安全无漏洞或排名。这些事实意味着:责任方只解决“谁决定网址形态”,不解决“是否被收录”。
另一个例外是历史遗留网址。如果旧规则仍在外部链接或缓存中存在,责任方不应把它们重新写入提交清单,而应通过重定向或失效状态处理。此时唯一责任方的边界是“新生成网址”,历史网址由另一套迁移流程负责,两者不能混在同一份规则表里。
选一个已知会冲突的路径类型,分别从两个系统触发生成,再检查提交清单中是否只出现一种形式。若只出现一种,说明合并逻辑生效;若出现两种,回到规则表确认是否有字段未被约束。验证时不要只看一次结果,应在内容更新、分页变化和参数变化后各检查一次,因为不同触发条件可能走不同代码路径。最终判断标准是:任何一条网址进入提交清单前,都能追溯到唯一一个决定方,而不是多个系统都能解释自己为什么写入了它。