先给结论:当同一路径返回的正文完全一致、只有响应头不同,日志里能确认的只有“这次请求的响应状态与头部特征”,不能据此断定页面版本、缓存命中或索引结果。真正受影响的是你对抓取预算分配、缓存层行为和下线决策的判断,而不是内容本身。
正文相同意味着你无法从日志中的字节数或哈希区分版本,但响应头会直接改变三件事的判断:
Age、Cache-Control、X-Cache 这类头不同,说明同一次抓取可能命中了不同缓存层,日志里的响应时间不能直接当作源站性能。Vary 或 Content-Language 不同,即使正文一样,也意味着抓取器可能拿到的是同一内容的不同协商变体。Location 或状态码差异配合相同正文,往往说明旧系统在返回“软 404”或旧版跳转,这类信号比正文更能说明该路径是否还值得保留。如果你只比对正文,就会把这些差异全部抹平,得出“页面没变”的错误结论。
假设你手里有一个旧路径 /old-guide,正文与新版 /guide 一致,但日志显示部分请求带 Cache-Control: no-store,部分带 Age: 3600。按下面顺序处理:
Cache-Control、Vary 分成若干组,统计每组出现的频次和时间分布。Age 只在某些时段出现,先检查 CDN 或反向代理的缓存规则,而不是立刻改源站。这一步的动作是拉取一份带响应头的原始请求记录,结果是你能区分“缓存层差异”和“源站差异”。no-store 的请求持续存在,说明有客户端或中间层在绕过缓存,这条路径可能仍被外部依赖。若差异只来自缓存命中,且正文已由新路径承接,则旧路径可以进入下线评估。这里的关键是:先按响应头分组,再决定是否动内容。反过来做,你会在内容没变的情况下误判为“版本回退”或“缓存失效”。
不是所有头部差异都同等重要。可以按影响面分两类:
Date、Server 版本号、X-Request-ID 这类每次请求都不同的字段,它们不改变抓取路径,也不影响旧路径是否保留。Cache-Control、Vary、Location、Content-Encoding。这些字段变化会改变缓存层行为、内容协商结果或跳转语义,直接影响你对“这条路径是否还在被使用”的判断。一个可操作的区分方法是:如果某头部字段的变化会导致同一 URL 在不同请求中返回不同处理路径,就把它归入必须追查的一类。
假设某旧页面正文与新版一致,日志中 80% 的请求带 Age 且状态码为 200,20% 的请求带 Cache-Control: no-store 且状态码为 200。若只看正文,你会认为该页面已无差异,可以安全移除。但按响应头分组后,那 20% 的请求说明仍有绕过缓存的访问路径存在。此时更稳妥的动作是先确认这 20% 来自哪些客户端或中间层,再决定是否保留该路径。这个判断的依据是响应头分组结果,而不是正文比对结果。
当你确认差异来自缓存层而非源站内容时,下一步应该是统一缓存策略并观察日志分组是否收敛;当你确认差异来自旧系统或旧合作关系遗留的响应头时,下一步才是评估该路径是否可以退出。无论哪种情况,都不要用“正文相同”作为保留或移除的唯一依据。响应头差异本身就是一条独立证据,它决定你接下来该查缓存、查协商,还是查旧依赖。