唯一责任方不是某个系统,而是写进配置库并带版本号的那份URL规范;当多个系统都能生成网址时,先指定一个系统为规范生成器,其余系统只能消费它产出的结果,不能各自拼路径。前提是你能列出所有会输出URL的系统及其触发条件,否则责任方只是名义上的。
多系统生成网址通常分两种情形,处理方式不同。
如果你分不清属于哪种,先做一次取样:在站点日志或页面源码中找出带分页、筛选、跟踪参数的三类URL,看它们是否共享同一段路径前缀。共享前缀说明是链式,前缀各不相同说明是并行。
选择上游系统作为唯一责任方。动作是让上游在生成URL时输出完整规范形式,包括大小写、末尾斜杠、参数排序规则,下游只做字符串拼接而不做规范化。结果是下游一旦发现异常URL,可以回溯到上游的具体输出批次,而不必逐系统排查。
代价是上游的改动会传导到所有下游,因此上游的URL模板必须走评审,不能由单个开发直接改。例外情况:下游需要生成上游不存在的参数组合(例如广告专用的跟踪参数),此时跟踪参数部分由下游负责,但路径部分仍归上游。
选择一份独立的URL模板配置作为唯一责任方,各系统只读该配置。动作是把路径规则、参数白名单、大小写约定写进配置库,配置变更走版本记录。结果是任何系统生成的URL都能对应到配置的某个版本,出现分歧时比较版本即可定位。
代价是引入配置依赖,系统启动或生成前需要读取配置,配置不可用时要定义降级行为(例如拒绝生成而不是自由拼装)。例外情况:临时活动页允许使用独立模板,但必须登记有效期,到期后回到共享配置。
第四步的校验结果决定下一步:如果校验频繁失败且集中在某个系统,说明该系统实际在独立拼URL,需要把它纳入责任方或改造为消费方;如果失败集中在某类参数,说明模板本身需要修订。
假设某站点有三个系统会输出URL:内容系统输出文章路径,分页组件追加页码,推荐模块追加来源参数。若把责任方定为内容系统,它输出 /a/123,分页组件只能追加 ?page=2,推荐模块只能追加白名单内的来源参数。若推荐模块自行改成 /a/123/2 这种路径形式,校验会拒绝输出,日志记录该模块的违规次数。当违规次数集中出现时,下一步不是改模板去兼容它,而是确认该模块是否真的需要独立路径——多数情况下它只需要参数。
URL规则统一不代表所有输出都被正确处理。robots.txt 中的抓取限制不等于可靠的索引移除,被限制抓取的URL仍可能因外部链接出现在结果中;站点地图不保证收录,提交规范URL只是提供发现线索;HTTPS 不保证安全无漏洞或排名。这些都不改变责任方的划分,但意味着你不能用“URL已统一”推断索引或排名结果。
另外,不同搜索引擎对参数、大小写、末尾斜杠的处理并不一致,责任方定义的是站内一致性,不是跨引擎的等价保证。若某类URL的请求量或抓取量归零,除了规则生效,也可能是链接被移除、页面被合并、抓取预算转移,需要分别核查后再决定是否调整责任方。