页面正文一样、响应头不一样,首先要判断差异是否落在缓存、编码、连接复用或跳转这几类会改变“客户端实际拿到什么”的字段上。如果只是日期、请求编号这类逐次变化的头,通常不影响对页面资源的判断;如果 Cache-Control、Content-Encoding、Vary、Location 或 Content-Length 不同,就必须把它当成不同的交付结果来处理,而不能因为 HTML 正文相同就当作同一份页面。
把两个响应并排看,先按影响范围分组。第一组影响“能不能复用”:Cache-Control、Expires、ETag、Last-Modified、Vary。第二组影响“字节怎么解”:Content-Encoding、Content-Type、Content-Length、Transfer-Encoding。第三组影响“请求去了哪”:Location、Set-Cookie、Strict-Transport-Security。第四组是逐次变化的观测值,如 Date、Age、请求追踪编号,它们通常不构成判断分歧。
分组之后,动作就明确了:第一组不同,要重新测缓存命中与回源频率;第二组不同,要重新测传输体积和解析耗时;第三组不同,要重新确认最终落点和登录态;第四组不同,可以暂时忽略。把差异归错组,后面所有测量都会建立在错误前提上。
假设你手上有同一路径的两次响应记录,正文完全一致,但一次带 Content-Encoding: br,另一次没有该字段。可以按下面的顺序处理:
Accept-Encoding、同一网络出口。条件不固定,差异无法归因。做完这一步,你会得到一个可复查的结论:差异是否真实影响传输体积。如果影响,下一步应检查服务端或中间层为何对同一路径给出不同编码,例如协商逻辑、代理缓存或回源节点不一致;如果不影响,就可以把这条差异从待办中移除,转而检查其他头字段。
当 Cache-Control 或 Vary 不一致时,正文相同并不能说明用户拿到的是同一份缓存对象。此时需要区分三种可能:一是不同中间缓存各自保存了副本;二是同一缓存因 Vary 键不同而分成多个条目;三是回源与命中缓存交替出现。
可区分的证据是 Age 与 X-Cache 一类字段的取值组合,以及重复请求时响应头是否稳定。若重复请求中 Age 递增而正文不变,偏向命中缓存;若 Age 始终缺失或重置,偏向每次都回源。这个判断会直接改变下一步:命中缓存问题要查缓存键与失效策略,回源问题要查源站处理与中间层配置。
如果差异出现在 Location 或 Strict-Transport-Security,正文相同几乎没有参考价值,因为客户端可能根本没有到达这个正文。先确认状态码,再看跳转链是否一致。跳转链不同意味着最终 URL 不同,后续对页面资源的测量对象也就不同。
这里要避免一个常见误判:看到 HTTPS 就认为链路安全无问题。HTTPS 只说明传输层加密,不保证没有漏洞,也不保证排名表现。同理,如果差异涉及 Set-Cookie,要确认登录态与个性化内容是否因此分叉,而不是只看未登录状态下的正文是否一致。
整理成一张对照记录:路径、请求条件、差异字段、所属分组、是否影响传输或落点、下一步动作。对每条差异标注适用条件,例如“仅在带 Accept-Encoding: br 时出现”,这样别人复查时能复现前提。
若差异被判定为无影响,就关闭该条并说明依据;若判定为有影响,就把它转成一项具体改动,并约定改动后重新测量同一组指标。需要注意,请求量或抓取量的变化不能单独证明处理正确,因为缓存策略调整、流量波动、上游代理变更都可能造成同样的现象。只有把响应头差异、测量条件和复测结果放在一起,判断才站得住。