先给一个有条件的结论:如果同一个站点里,CMS、路由中间件和CDN/边缘配置都可能改写或生成URL,那么“唯一责任方”不能按系统数量来分,而应按最终写入响应或页面链接的那一层来定。只有先确定哪一层拥有最终输出权,百度近日收录查询的结果才有可解释性;否则你看到的“近日收录”变化可能只是不同层各自输出了一套地址。
多个系统同时生成网址时,常见误区是把“谁先产生URL”当成责任方。实际排查中,更可靠的是看最终返回给爬虫的HTML、重定向链和站点地图里出现的是哪一套地址。可以用一个最小核对动作:选取同一内容页,分别查看页面源码中的规范链接、服务端返回的跳转目标、站点地图中该页的地址。若三者不一致,说明至少有两个系统在输出不同版本的网址。
此时唯一责任方应定义为:其输出被最终响应采用,并且其他系统无法在后续环节覆盖的那一层。这个定义不依赖系统名称,只看实际生效顺序。若CMS生成带参数的地址,但边缘层又统一重写为无参数地址,那么责任方在边缘层;反过来,若边缘层只做透传,CMS输出什么就返回什么,责任方仍在CMS。
假设你确认边缘层是最终输出方,于是把唯一责任方定在边缘层。但如果站点地图由独立任务生成,且该任务读取的是CMS数据库而不是最终响应,那么站点地图仍会持续输出另一套地址。这时边缘层虽然是页面响应的责任方,却不是站点地图地址的责任方。百度近日收录查询若显示部分地址被收录、部分未收录,就不能只归因于边缘层。
这个反例说明:唯一责任方必须按输出通道分别定义,而不是全站只设一个。页面响应、站点地图、内部链接、重定向规则可能各有最终写入方。把它们强行合并成一个责任方,会让后续修改互相抵消。
当百度近日收录查询出现与直觉相反的结果时,不要先假定是收录延迟或惩罚。先区分以下解释:
这三种解释对应不同的责任方。地址冲突通常指向规范链接的输出层;抓取限制指向robots.txt的维护方;输出未生效指向配置加载或缓存层。只有证据指向同一层时,才可以把该层定为唯一责任方。
假设某站点有三层:CMS生成 /article/123,路由中间件追加 ?from=list,边缘层删除查询参数并输出 /article/123。再假设站点地图任务直接读CMS,输出 /article/123?from=list。此时页面响应的唯一责任方是边缘层,站点地图的唯一责任方是站点地图任务。若百度近日收录查询显示带参数地址被收录、无参数地址未被收录,优先检查站点地图任务和内部链接,而不是继续改边缘层。
这个例子的关键不是数字,而是比较方法:先固定一个内容页,记录三个通道各自输出的地址,再判断哪个通道的输出与查询结果一致。一致的那个通道,才是当前需要承担修改责任的一方。
在定义唯一责任方之前,先做一个实际动作:把当前各通道的输出地址各保存一份,并记录保存时间。这个动作的结果会直接影响下一步——如果保存后发现同一通道在短时间内输出不同地址,说明存在动态生成或缓存抖动,此时不应指定唯一责任方,而应先稳定输出。稳定后再按通道指定责任方,并只修改该通道。修改后重新核对同一组地址,若页面响应、站点地图和内部链接恢复一致,再观察百度近日收录查询的变化;若仍不一致,说明还有未识别的输出层,需要回到证据区分步骤,而不是重复修改已确定的层。