先给结论:不要从最外层缓存的响应开始猜,而要先确认各层拿到的 robots.txt 是否来自同一份源文件、同一套规则和同一个生效时间点。如果源站只有一份正确版本,问题通常出在缓存键、缓存层级或回源条件;如果源站本身就存在多份版本,缓存只是把差异放大。定位顺序应是先锁定源站版本,再逐层比对响应,最后才决定清哪一层、保留哪一层。
多层缓存返回不同版本,最常见的分叉点是源站本身存在两份或更多内容。例如旧系统目录下残留一份 robots.txt,新应用又生成一份;或者发布流程把文件同时写到不同存储位置,不同回源路径命中不同副本。此时缓存层并没有制造不一致,只是分别缓存了不同来源。
要区分这种情况,先记录每个缓存节点回源时实际读取的路径、文件大小、修改时间和内容摘要。假设源站有两个发布目录:A 目录保留旧规则,B 目录是新规则。若边缘节点回源到 A,中心缓存回源到 B,那么两层返回不同版本就完全合理。下一步不是清缓存,而是合并发布入口,让所有回源都指向同一份文件。
判断依据可以这样用:如果各层响应的差异能稳定对应到不同回源路径,优先处理源站发布;如果各层回源路径相同但响应仍不同,才进入缓存层排查。
条件一:源站只有一份 robots.txt,且内容摘要一致。此时各层返回不同版本,重点查缓存键和缓存层级。常见原因是缓存键包含了协议、主机名、端口、查询字符串或请求头的组合,而不同层对同一资源的键计算方式不同。例如带 ?v=2 的请求被单独缓存,不带参数的请求命中另一份旧缓存。动作是统一缓存键策略,让同一路径只对应一个缓存对象,然后按从内到外的顺序逐层刷新。刷新后再次比对内容摘要,如果外层仍返回旧版本,说明还有上层缓存或中间代理持有副本。
条件二:源站存在多个版本,或发布流程无法保证原子替换。此时仅清缓存无法解决,因为下一次回源仍可能拿到另一份。动作是先冻结发布入口,保留仍然有价值的规则片段,把需要退出的旧规则从所有源文件中移除或合并,再统一发布。验证时不要只看某一层是否更新,而要确认所有回源路径都返回同一份文件。若某个旧系统暂时无法下线,可以用独立的回源标识把它隔离,避免它继续参与同一路径的缓存竞争。
多层缓存的不一致经常被误判,因为每次测试的请求条件不同。定位时应固定协议、主机名、路径、查询字符串和请求头,在同一时间窗口内依次请求各层,记录状态码、内容长度、修改时间和内容摘要。不要用“某层看起来是新的”作为判断,而要用可比较的字段。
一个短例子:假设边缘缓存返回旧规则,中心缓存返回新规则,源站返回新规则。固定请求条件后,如果边缘缓存的响应头显示命中时间早于源站修改时间,说明它持有的是旧副本;如果命中时间晚于源站修改时间但仍返回旧内容,则要检查边缘缓存是否走了不同的回源路径或缓存键。这个判断会影响下一步:前者只需刷新边缘层,后者需要先修正回源配置。
还要注意,抓取量或请求量短暂归零不能单独证明 robots.txt 已正确生效。它可能来自缓存命中、抓取频率自然波动、网络中断或测试条件变化。要结合源站版本、各层响应和实际抓取行为一起判断。
当旧内容、旧系统或旧合作关系需要退出,而部分规则仍有价值时,不要直接删除整份 robots.txt,也不要指望抓取限制能完成索引移除。robots.txt 控制的是抓取行为,不等于可靠的索引移除手段。对于仍需保留的路径,可以先列出规则清单,逐条确认它对应的目录、文件类型和当前用途,再决定合并、改写还是删除。
实施动作可以分三步:第一,把保留规则和退出规则分开标注,避免在替换时误删仍需要的部分;第二,统一发布到唯一源文件,并确认所有回源路径指向它;第三,按从内到外的顺序刷新缓存,每次刷新后记录各层内容摘要。若某条规则涉及站点地图或索引状态,还要分别核查不同搜索引擎的支持情况,不能假设一处生效就处处生效。
例外情况是:如果旧系统已经无法修改,但必须让它退出同一路径的缓存竞争,可以给它分配独立主机名或独立路径,让它的 robots.txt 不再与主站共用缓存键。这个动作的目标是隔离,而不是继续维护两套规则。完成隔离后,再观察主站各层是否稳定返回同一版本,并据此决定是否还需要进一步清理旧缓存。