同服务器网站查询时,缓存最容易制造两类假象:一是你查到的其实是旧快照或本地缓存,二是服务器返回的内容被中间层替换过。排除缓存的核心原则是:先确认“你看到的结果来自哪里”,再判断它是否代表服务器当前真实响应。不要一看到多个站点内容相似就下结论,也不要只清一次浏览器缓存就认为问题解决。
同一台服务器上放多个网站,查询结果可能被四层缓存影响:
这四层中,只有服务器端缓存属于“源站自己的缓存”,其余三层都可能让你误判同服务器网站的真实内容。
最直接的检查方法是对同一个 URL 发起两次请求:一次走常规访问路径,一次绕过缓存。对比两次返回的响应头与正文是否一致。
可以执行的步骤:
cache-control、age、x-cache、cf-cache-status 等字段。出现 age 大于 0 或 hit 字样,说明命中了中间缓存。curl -H "Cache-Control: no-cache" -I https://example.com/page。这只影响请求侧,不代表中间层一定遵守。curl -H "Host: example.com" http://源站IP/page。这是绕过 CDN 和 DNS 缓存最可靠的方式。适用条件是你能拿到源站 IP 且服务器接受 Host 头直连。若源站只允许 CDN 回源、或使用了强制 HTTPS 与 SNI 校验,直连可能失败,此时应改用 CDN 提供的刷新功能并核对回源日志。
很多人排查同服务器网站时,第一反应是清浏览器缓存或无痕模式打开。这只能排除本地浏览器缓存,无法排除 CDN、反向代理和服务器端缓存。无痕模式仍会经过同一网络路径和同一 CDN 节点,看到的可能还是同一份旧副本。
另一种误解是认为“加了随机参数就一定拿到新内容”。给 URL 加 ?v=123 通常能绕过按完整 URL 缓存的层级,但对忽略查询字符串的缓存配置无效,也不能绕过服务器端按页面 ID 缓存的对象缓存。
确认存在缓存干扰后,常见处理分两类:
cache-control 的 max-age、s-maxage 以及 Vary 设置,确认动态页面是否被错误地长期缓存。判断结果是新内容发布后能在预期时间内自动生效,而不必每次手动刷新。选择依据是问题出现的频率和范围:偶发一次用刷新;同一类页面反复出现,说明策略本身需要修改。
缓存假象常和索引问题混在一起。需要明确:robots.txt 的抓取限制不等于可靠的索引移除,被限制抓取的页面仍可能出现在结果中;站点地图不保证收录;HTTPS 也不保证安全无漏洞或排名。排查同服务器网站时,应把“缓存返回的旧内容”和“搜索引擎索引中的旧快照”分开处理,前者靠请求对比定位,后者需要在确认页面可抓取后,通过各搜索引擎分别提供的移除或更新工具核查,且不同搜索引擎的支持情况须分别核查。
下一步:挑一个你怀疑被缓存干扰的 URL,按上面的方法做一次直连源站与常规访问的响应对比,记录两次的状态码、响应头和正文差异,再决定是刷新缓存还是调整缓存策略。