当CMS、CDN、前端路由和跳转服务各自生成或改写网址时,唯一责任方不是某个系统,而是“最终输出URL的那一层”。判断方法是:固定同一份输入,逐层抓取该层输出并与上一层对比,哪一层的输出首次出现目标URL形态,责任就落在哪一层。若两层输出完全一致,则责任上移到更靠近用户请求的那一层。这个定义必须先于修改配置,否则同一批URL会被反复改回。
第一种条件:URL在服务端渲染或重写阶段就已确定,之后CDN和前端只做透传。此时责任方是服务端路由或重写规则,CDN和前端路由只承担校验职责。第二种条件:服务端只返回基础路径,规范化、尾斜杠、大小写和参数顺序由边缘层或前端在后续阶段生成。此时责任方是边缘层或前端路由,服务端不再对最终形态负责。
区分这两种条件,不能看配置文件写了什么,要看实际响应。用同一路径分别请求源站和经过CDN的地址,比较返回的Location头、规范链接和页面内自引用URL。如果源站返回的已是最终形态,责任在源站;如果源站返回基础形态、经过边缘层后才变成最终形态,责任在边缘层。这个动作的结果直接决定下一步:责任在源站时,改边缘层无效;责任在边缘层时,改源站模板会被下一层覆盖。
先给每一层建立可对比的输出记录,再决定在哪一层落规则。具体步骤:
这里的关键动作是“把其他层改为透传”。如果只在责任层加规则、却保留其他层的自动规范化,两层会互相覆盖,表现为规则时有时无。把非责任层改为透传后,输出会稳定下来,下一步才能判断规则本身是否正确,而不是继续排查哪层在打架。
存在两类例外。第一类是外部系统持有权威映射,例如旧站迁移时由独立的重定向服务维护路径对应关系。此时责任方是那个持有映射的服务,其他层必须完全让路,不能各自补一条规则。第二类是同一路径存在多个合法形态且业务上都需要保留,例如带与不带尾斜杠都指向不同内容。此时不应强行指定唯一责任方去合并,而应把两种形态都登记为独立输出,责任方只负责保持各自稳定。
判断是否落入例外,看修改责任层后输出是否仍被外部映射或业务语义拉回原状。如果拉回,说明唯一责任方的边界需要缩小到“只负责形态稳定,不负责合并”。这一步会改变后续动作:原本计划删除重复路径,改为登记并监控两条路径,避免误删仍有用途的地址。
假设某站点源站返回 /product/ABC,经过边缘层后变成 /product/abc/,前端路由又追加查询参数。固定请求 /product/ABC,记录三层输出:源站输出保持大写无斜杠,边缘层输出转为小写加斜杠,前端输出追加参数。首次出现目标形态的是边缘层,责任方即为边缘层。动作是把源站和前端改为透传,只在边缘层保留规范化规则。结果是输出稳定为一种形态,后续检查只需盯边缘层。这个例子是假设,用于说明比较方法,不代表任何真实站点。
若记录显示源站和边缘层输出一致、只有前端不同,责任方就是前端路由;若三层输出完全一致但外部跳转服务仍返回旧地址,责任方在外部服务。不同结果对应不同下一步,不能跳过记录直接改配置。
责任方确定后,验证应集中在两点:同一输入多次请求输出是否一致,以及责任层变更后其他层是否仍保持透传。若发现抓取工具报告的URL数量下降,不能直接判定处理正确,因为缓存、抓取预算分配和请求抽样都可能造成同样现象,需要结合逐层记录判断。站点地图提交不保证收录,robots.txt限制抓取也不等于可靠的索引移除,这些都不能替代对责任层输出的直接核对。HTTPS同样不构成对URL规则正确性的保证。
如果站点依赖多个搜索引擎,还需分别核查各自对规范化信号的支持情况,不能假设一套规则在所有引擎中产生相同结果。责任方定义解决的是内部一致性问题,不承诺任何收录或排名结果。最终应把责任方、透传层和例外清单写成一份可对照的记录,每次URL异常先查这份记录,再决定改哪一层。