结论先说:如果多个系统都会生成或改写网址,唯一责任方应当定义为“最终写入页面可抓取链接的那个系统”,而不是最早产生候选网址的系统。判断依据不是谁生成得多,而是谁决定最终输出。若无法确认最终输出由谁控制,先不要改规则,先做一次输出链路核对;否则修改可能落在不生效的层,后续排查会继续混乱。
常见链路是:内容系统给出标识,路由系统拼接路径,CDN 或网关做重写,前端再做规范化。最早生成候选网址的系统往往只提供原料,它不掌握最终响应里的链接形态。把责任放在它身上,会出现一个典型后果:改了它,线上链接没变,因为下游还有一层重写覆盖了结果。
唯一责任方的判定条件可以压缩成三条:
三条同时成立,才适合把责任定在它身上。只满足第一条但变更需要人工同步到另一系统,责任实际上被拆散了,后续仍会出现两套规则并存。
做法一:把责任放在路由或网关层。成立条件是所有对外链接都经过这一层,且它有能力在输出前统一规范化。代价是这一层通常离业务最远,规则变更需要跨团队排期,出错时影响面大。适合链接形态长期稳定、变更频率低的站点。
做法二:把责任放在直接渲染链接的应用层。成立条件是应用层是最终输出方,且没有下游重写。代价是多个应用各自实现规则时容易分叉,需要一份共享的规范化函数或配置。适合迭代快、链接规则经常调整的站点。
选择时看一个信号:如果同一个逻辑页面在不同入口出现了两种链接形态,且修改其中一个系统的规则后另一种仍然存在,说明责任没有收敛到最终输出方。此时先收敛责任,再谈具体规则。
假设网关会统一重写链接,但站点地图由独立任务生成,任务直接读取内容系统的原始标识,不经过网关。这种情况下,页面内链接的责任在网关,站点地图里的链接责任却在生成任务。表面上“最终输出方”是网关,实际存在两个输出面。
这个反例说明:唯一责任方必须按输出面分别定义,而不是按整站只定义一个。页面内链接、站点地图、分页与筛选链接、结构化数据里的链接,可能各有最终输出方。把它们混成一个责任方,就会出现“页面链接已统一、站点地图仍是旧形态”的割裂。站点地图不保证收录,但站点地图里的链接形态与页面不一致时,会增加核对成本,这一点与是否收录是两件事。
第一步,列出所有会输出网址的系统,并标注每个输出面由谁最终写入。第二步,为每个输出面指定一个责任方,写成一句话:某输出面的链接形态由某系统决定,其他系统不得覆盖。第三步,做一次对照:从线上抓取页面内链接、站点地图链接和结构化数据链接,比较同一逻辑页面是否得到同一形态。
对照结果决定下一步。如果三个输出面形态一致,说明责任已收敛,可以进入规则调整。如果不一致,先不要改规则,先确认哪个输出面是抓取端主要依赖的入口,再让该输出面的责任方统一其余输出面。顺序反了,改动会被未收敛的输出面抵消。
不同搜索引擎对链接规范化、参数处理和站点地图的支持并不一致,同一套规则在不同抓取端的表现可能不同,需要分别核查,不能用一个引擎的结果推断另一个。robots.txt 的抓取限制不等于可靠的索引移除,它只控制抓取,不负责把已收录内容移除。HTTPS 不保证安全无漏洞,也不保证排名。这些边界不影响责任方的定义,但会影响你对“改了之后是否生效”的判断,因此核对时要把它们与网址规则问题分开记录。
如果抓取量或某个统计突然归零,不能单独证明责任方定义正确。它还可能来自抓取预算变化、临时拦截、发布节奏改变或统计口径调整。把归零当作唯一证据,容易把无关变更误判为原因,下一步动作就会偏离。
最后给一个可执行的收尾动作:把每个输出面的责任方写进变更记录,并规定任何新增输出面必须先指定责任方再上线。这样下一次出现链接形态冲突时,你能直接定位到唯一责任方,而不是在多个系统之间反复试探。