先给一个可操作的判断:如果同一路径的 robots.txt 在不同网络位置返回不同内容,不要从规则文本本身找原因,先固定“谁在什么条件下拿到哪一版”。做法是用带缓存诊断头的请求分别从源站、CDN 边缘节点和本地递归解析路径各取一次,记录响应头中的 Age、Cache-Control、ETag 和实际正文哈希。只有先确认分歧发生在哪一层,才能决定是保留旧版本、改写缓存策略还是让某条路径退出缓存。
多层缓存下出现版本差异,常见原因并不相同。第一种是源站本身在不同后端返回不同文件,比如多台源服务器未同步,或对象存储与回源目录指向了不同副本。第二种是中间层缓存了旧副本,边缘节点尚未过期,而源站已经更新。第三种是请求路径不同导致命中不同缓存键,例如带与不带查询串、HTTP 与 HTTPS、不同 Host 头分别落到不同缓存对象。
区分方法很直接:对同一 URL 连续请求多次,观察正文哈希是否稳定。如果同一节点多次请求结果一致、不同节点之间不一致,问题偏向中间层副本分裂;如果同一节点短时间内结果就跳变,偏向源站多后端不一致或缓存键设计有问题。这个判断会直接影响下一步——源站问题要改发布流程,缓存问题要改刷新或过期策略,缓存键问题要统一规范化规则。
确认分歧层之后,才轮到决定怎么处理旧版本。这里没有通用答案,只有前提是否成立。
如果旧系统或旧合作关系即将退出,但其中仍有有价值的规则片段,优先做“改写并强制统一”,把保留部分合并进唯一源文件,而不是让两套文件并存。并存本身就是版本分歧的温床。
假设某站点有源站、一个 CDN 边缘节点和一个本地递归解析路径。对同一 robots.txt 路径请求后得到三份正文:源站为版本 B,边缘节点为版本 A,本地路径为版本 A。此时不要直接判定“缓存坏了”。先看响应头:如果边缘节点的 Age 较大且 Cache-Control 的 max-age 尚未到期,说明它只是合法地持有旧副本;如果源站也返回版本 A,则说明发布没有真正落到源站。
下一步动作取决于这个观察结果。若源站确为版本 B,则对边缘节点发起针对该路径的刷新,并记录刷新前后的 ETag;刷新后再次请求,若正文哈希与源站一致,说明分歧已收敛,可以进入回归验证。若刷新后仍返回版本 A,则要检查是否存在第二个缓存层或缓存键差异,而不是继续重复刷新。这个例子的数字仅用于说明比较方法,不代表任何真实站点的表现。
抓取量下降、某路径请求归零、或某个节点突然返回 200,都不能单独证明处理正确。请求量变化可能来自抓取节奏调整、站点整体流量波动或路径本身被其他规则覆盖;返回 200 只说明该层能响应,不说明返回的是目标版本。因此验证应以正文哈希和关键响应头为主,请求量只作为辅助观察。
另外要分清边界:robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。如果分歧涉及的是“某路径是否该被抓取”,不要用缓存一致性验证替代对规则意图的确认。不同搜索引擎对 robots.txt 的支持细节需要分别核查,不能假设一份文件在所有抓取方那里行为相同。
这套顺序的价值在于把“感觉不一致”变成可比较的证据。每次操作后记录哈希和响应头,下一次出现同类分歧时可以直接对照,而不必从零猜测。对于需要退出旧内容、旧系统或旧合作关系的场景,先让 robots.txt 在每一层返回同一版本,再决定哪些规则保留、哪些改写、哪些随旧路径一起退出,顺序不能颠倒。