先给结论:不要从提交结果反推,而要从“哪一层缓存最先返回了与源站不同的字节”入手。多层缓存下,URL提交工具拿到的版本、CDN边缘节点返回的版本、源站渲染的版本可能各不相同。定位一致性问题的正确顺序是:固定请求标识,逐层比对响应头与正文指纹,找到第一处分叉点,再决定是保留现有缓存策略、改写提交方式,还是退出该提交路径改用其他发现机制。
多层缓存的不一致往往不是随机的,而是由请求特征触发的。在比对之前,先固定以下变量:请求的完整URL(含查询串)、User-Agent、Accept-Encoding、Cookie有无、以及是否带缓存绕过头。用同一组变量分别请求源站、中间层和边缘层,记录每层的响应状态、缓存命中标记、内容长度和正文哈希。
关键动作是给每层响应算一个正文指纹,而不是肉眼看页面。可以用命令行抓取后计算哈希,例如:
curl -s -H "User-Agent: ..." "https://example.com/path" | sha256sum
对源站、中间层、边缘层各跑一次,得到三个哈希。如果三者一致,说明缓存不是问题,应转向提交工具本身的抓取或解析环节;如果三者不一致,第一个与源站不同的哈希所在层,就是分叉点。这一步的结果直接决定下一步:分叉在边缘层,就查边缘的缓存键与TTL;分叉在中间层,就查中间层的变体规则。
找到分叉点后,处理方式取决于该层缓存是否“本该”缓存这个版本。
保留现有缓存策略的适用前提是:不同版本在语义上等价,只是压缩、空白或时间戳差异。此时不必改缓存,只需在提交前统一指纹口径,避免把无害差异误判为故障。代价是每次排查都要多做一次归一化,收益是不动线上配置。
改写提交方式的适用前提是:分叉由请求特征触发,例如带Cookie的请求命中了一个私有缓存变体,而不带Cookie的提交工具抓到了另一个版本。此时应让提交工具使用与目标缓存一致的请求特征,或显式声明变体维度。动作是核对缓存键里包含哪些维度,把提交请求对齐到公开版本。结果是提交工具与缓存返回同一版本,一致性恢复。
退出该提交路径的适用前提是:多层缓存的变体规则无法在合理成本内对齐,且页面本身可通过站内链接、站点地图等常规方式被发现。此时继续依赖提交工具只会反复制造假象。退出的代价是发现速度可能变慢,收益是不再把缓存差异误当作提交失败。
这两类现象容易混淆,但证据不同。缓存不一致的特征是:同一URL在不同层返回不同正文,且差异可随请求头变化而复现。提交工具没生效的特征是:各层返回的正文一致,但提交后目标侧长时间未出现对应记录。
需要提醒的是,抓取量或提交记录归零,不能单独证明某层处理正确。它还有别的合理解释:该层可能只是尚未刷新、请求被限流、或统计口径本身变化。因此判断依据应是逐层指纹比对,而不是单一计数。
另外,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。这两点会影响你对“退出提交路径”这一选项的评估:如果页面被robots.txt挡住,换用站点地图同样不会让它进入索引。
假设某页面在源站返回版本A,中间层缓存返回版本B(缺少一段动态区块),边缘层返回版本C(带旧时间戳)。用同一请求变量逐层抓取后,哈希显示边缘层与源站不同,中间层与源站相同。
此时分叉点在边缘层,而不是提交工具。下一步应查边缘层的缓存键是否遗漏了某个变体维度,而不是去反复重新提交URL。如果核对后发现边缘层缓存键包含了一个提交工具不携带的请求头,那么改写提交方式(对齐该请求头)比退出更划算;如果该请求头无法由提交工具控制,则应考虑退出该路径,改用页面内链接和站点地图作为发现手段。这个判断链条的关键,是先有哈希证据,再选动作。
定位完成后,记录应包含:固定请求变量、各层响应状态与正文指纹、第一处分叉层、以及所选处置方式及其适用条件。这样下一个人不必重跑全部比对,只需验证分叉层是否已对齐。一致性问题的闭环标准不是“提交成功”,而是各层对同一请求返回同一版本。