核心做法是:把“谁有权决定一个URL最终长什么样”写成一条可执行的规则,并让这条规则在流水线上游生效,而不是在下游互相覆盖。多个系统同时生成网址规则时,唯一责任方应当是URL规范形态的生产者,而不是提交索引申请的一方。索引申请只消费已经定稿的URL,不负责改写或纠正它。
假设有一个内容站点,后台CMS按文章ID生成路径,前端框架按路由配置生成路径,站点地图生成器又从数据库直接拼路径。这三者都可能产出URL,但责任不能平分。
如果URL形态由数据本身决定,比如文章永久标识、商品编号,那么数据库或内容模型是唯一责任方,其他系统只能读取,不能自行拼装。如果URL形态由展示层决定,比如栏目层级、语言前缀、分页参数,那么路由配置是唯一责任方,数据库只提供字段,不决定拼接顺序。
判断依据很简单:当两个系统对同一个页面给出不同URL时,哪个系统的输出被当作最终对外地址,哪个就是责任方。另一个系统必须改为引用,而不是继续生成。
关键前提变化会改变责任归属。变更前,如果站点只有一套路由,责任方就是路由配置。变更后,如果引入多语言、多域名或内容分发,URL形态可能改由数据层的规范字段决定。
区分条件可以这样看:
一旦责任方转移,旧系统要做的不是继续生成再被覆盖,而是改为读取新责任方的输出。否则索引申请提交的地址可能和实际可访问地址不一致。
定义责任方不能只靠口头约定。至少要留下三类可检查的约束:
这里要说明一个实际动作:把站点地图生成器改为读取路由导出的URL清单,而不是直接查数据库。这个动作的结果是,一旦路由规则调整,站点地图会同步变化,索引申请提交的地址不再出现旧路径。下一步就可以把比对结果作为发布门禁,而不是等抓取异常后再回头排查。
需要提醒的是,站点地图不保证收录,robots.txt的抓取限制也不等于可靠的索引移除。这些手段不能替代责任方定义,只能作为辅助信号。
假设某站点有CMS、前端路由和站点地图生成器。CMS按栏目和标题生成路径,前端路由按配置生成带语言前缀的路径,站点地图生成器按数据库ID生成路径。三个系统同时运行,对外出现三套地址。
收口步骤可以这样走:先确定唯一责任方为前端路由,因为它决定实际可访问地址。然后让CMS只输出内容字段,不再输出对外路径;让站点地图生成器改为读取前端路由导出的URL清单。最后在发布前比对三份输出,只有前端路由的清单被允许进入索引申请流程。
如果变更后引入新的语言版本,责任方仍是前端路由,但需要把语言前缀规则写进路由配置,而不是让CMS或站点地图各自添加前缀。这样索引申请面对的始终是一份定稿清单,而不是多个系统互相覆盖后的残留地址。
当索引申请没有进展时,不要直接归因于提交动作。先收集三类证据:实际可访问URL、站点地图中的URL、内链指向的URL。如果三者不一致,问题在URL生成责任,不在索引申请本身。
此时的处理顺序是:先停止非责任方继续生成URL,再统一到唯一责任方输出,然后重新生成站点地图并检查内链。只有当对外URL稳定一致后,索引申请才有意义。若责任方已经明确但历史变体仍在被访问,应通过规范地址和跳转规则收口,而不是反复提交新地址。
责任方定义清楚后,索引申请就变成一个下游动作:它提交的是已经定稿的地址,而不是用来解决上游冲突的工具。这个顺序反过来做,通常只会让问题更难定位。