排除缓存假象的核心做法是:不要只看一次页面返回结果,而是用“带随机参数的URL + 查看原始响应头 + 用抓取工具模拟访问”三种方式交叉验证。如果带随机参数能返回新内容,而原URL仍返回旧内容,问题多半在缓存层;如果两者都返回旧内容,则更可能是页面本身没有更新、发布状态不对或抓取工具拿到的是旧副本。适用前提是你已经确认源站文件或数据库内容确实改了,否则后面的排查没有意义。
第一类是浏览器缓存:你本机看到旧页面,但其他网络环境已经看到新页面。第二类是CDN或反向代理缓存:源站已更新,边缘节点仍返回旧副本。第三类是搜索引擎或抓取工具的缓存副本:页面早已更新,但抓取结果展示的是上一次抓取的内容。这三种现象的验证方法不同,不能混在一起判断。
?v=20240601,看返回内容是否变化。假设你的文章页地址是 https://example.com/a.html,源站已经改成新标题。此时分别请求:
https://example.com/a.html
https://example.com/a.html?test=abc123
如果第一个返回旧标题,第二个返回新标题,说明缓存层按完整URL做键,原URL命中了旧缓存。如果两个都返回新标题,说明缓存已经刷新或本来就没缓存。如果两个都返回旧标题,说明问题不在缓存,需要检查源站发布流程、模板调用或数据库读取。
这个方法的适用条件是:页面是静态或可带查询参数访问的普通网页。如果站点对查询参数做了强制跳转或屏蔽,随机参数法会失效,此时改用响应头中的 Age、X-Cache、CF-Cache-Status 等字段判断。不同CDN的响应头名称不同,以实际返回为准。
用浏览器开发者工具的“网络”面板,或命令行工具请求目标URL,重点看以下字段:
Age:大于0通常表示响应来自缓存,数值是缓存驻留秒数。Cache-Control:看 max-age 和 s-maxage,判断允许缓存多久。X-Cache 或类似字段:不同服务商命名不同,HIT 表示命中,MISS 表示回源。Last-Modified 与 ETag:对比源站文件的实际修改时间。如果 Age 很大且内容为旧,基本可以确认是缓存层返回了旧副本。此时需要清除对应URL的缓存,或等待缓存过期。若 Age 为0但内容仍是旧的,则缓存不是主因,应回到源站排查。
方案一:主动刷新缓存。适用于你确认源站已更新、且缓存层支持按URL刷新。做法是提交刷新任务,然后立即用随机参数和原URL各请求一次,观察原URL是否返回新内容。验收信号是原URL的响应头中 Age 归零或明显变小,且正文为新内容。
方案二:等待缓存自然过期。适用于缓存层不提供刷新入口,或刷新额度有限、页面优先级不高。做法是查看 Cache-Control 中的 max-age,估算最晚过期时间,期间不要反复提交同一URL。验收信号是过期后原URL自动返回新内容,无需额外操作。
选择依据:如果页面时效性强、需要尽快让抓取工具看到新内容,优先主动刷新;如果页面更新频率低、缓存时间本身很短,等待过期更省事。两种方案都要以“原URL返回新内容”为最终判断,而不是以“提交成功”或“刷新按钮变灰”为准。
缓存刷新后,抓取工具可能仍展示上一次抓取的结果。此时应重新发起一次抓取,并查看返回的HTML源码,而不是只看页面标题预览。如果源码已是新内容,但展示结果仍旧,说明是抓取工具的展示缓存,不影响实际收录判断。如果源码仍是旧内容,则要检查抓取工具请求时是否带了特殊参数、是否被重定向到旧地址、是否命中了另一层缓存。
另外,robots.txt 的抓取限制不等于索引移除,站点地图也不保证收录。缓存排查解决的是“看到的是不是最新版本”,不能替代收录状态本身的检查。
下一步:选一个已更新但显示仍旧的页面,按“随机参数请求 → 看响应头 → 决定主动刷新或等待过期 → 重新抓取看源码”的顺序走一遍,把结果记下来,再判断问题出在缓存层还是发布流程。