要定位这类不一致,先别把“Baiduspider抓取到不同版本”当成单一故障。更可行的做法是:把每个角色的说法转成可核对的请求—响应记录,固定一个URL、一组请求头和一条时间线,分别从CDN边缘、反向代理、应用缓存与源站取同一资源,比较状态码、响应头、正文指纹和缓存命中标识。若四层返回的指纹不同,问题在缓存键或失效链路;若四层指纹相同但Baiduspider抓取结果仍不同,则更可能是请求特征差异、抓取时段差异或索引侧尚未更新。
多个角色对同一事实理解不同,通常不是谁在说谎,而是各自看到的缓存层不同。开发在源站看、运维在代理层看、SEO在搜索摘要里看,三者都可能正确,却指向不同版本。把分歧转成项目的第一步,是选一个具体URL,记录完整请求:User-Agent、Accept-Encoding、Cookie有无、查询参数、请求时间与出口IP段。然后对同一URL连续取多次响应,保存正文的哈希值或固定长度摘要。动作的结果决定下一步:如果同一层多次请求就出现两个哈希,说明该层自身存在多副本或过期策略冲突;如果同一层稳定、跨层不同,才需要往下追缓存键与回源规则。
第一种解释是缓存键不一致。CDN可能按URL加查询参数缓存,反向代理可能忽略部分参数,应用层可能把User-Agent或设备类型纳入缓存键。结果就是同一个URL在不同层被当成不同对象,回源次数与版本随之分叉。第二种解释是抓取请求特征触发分支。Baiduspider的请求头、协议版本、是否携带压缩协商,可能与浏览器或内部测试工具不同,源站据此返回简化页、不同编码或不同语言版本。两种解释都会表现为“抓取到的和看到的不一样”,但修复方向完全不同:前者要统一缓存键与失效规则,后者要对抓取特征做定向验证。
把证据做成一张可核对的矩阵,比口头描述有效。对同一URL,分别向边缘节点、反向代理、应用缓存、源站各请求一次,记录四项:HTTP状态码、关键响应头(缓存命中、Age、Vary、内容编码)、正文指纹、回源标记。再对Baiduspider特征与普通浏览器特征各做一轮。判断规则可以这样用:
这里要说明一个必要前提:指纹比较只对同一URL、同一时间窗有效。跨天比较会把正常的发布或回滚误判为缓存不一致。假设某次发布后,边缘层Age为600、代理层Age为0、源站指纹为B,而边缘指纹为A,这只能说明边缘尚未失效,不能单独证明源站处理错误;反过来,若源站指纹也为A,则要检查发布是否真正落到源站。这个例子是假设性的,用于说明比较方法,不代表任何真实项目结果。
定位到具体层之后,下一步不是立刻清缓存,而是先确定失效责任。若问题在缓存键,动作是统一各层的键规则,并明确哪些参数参与、哪些忽略;结果会减少同一URL的多版本回源,后续验证只需看跨层指纹是否收敛。若问题在请求特征分支,动作是让源站在抓取特征下返回与主版本一致的内容,或明确声明差异是预期的;结果会影响Baiduspider抓取到的正文与后续索引判断,因此需要重新取一次带相同特征的响应来确认。若问题只在索引侧,动作是核对抓取日志与页面当前版本,而不是反复刷新缓存;结果决定是等待重新抓取,还是修正阻止抓取的规则。
还要提醒一点:robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。多层缓存一致性解决的是“返回哪个版本”,不是“一定被收录或排名”。把这两件事分开,能避免把缓存修复当成收录承诺。最后,所有验证都应保留同一URL、同一请求特征、同一时间窗的记录,否则下一次分歧仍会回到起点,而无法用可核对的证据收敛。