做站点运营时,常会遇到一种情况:后台已经更新了标题或正文,自己刷新也能看到新内容,但搜索蜘蛛抓到的还是旧版本,或者不同地区访客看到的页面不一致。这类问题不一定出在抓取或索引环节,很多时候是缓存层没有及时失效。
缓存的目的本来是减少服务器压力、加快访问速度,配置合理对抓取和体验都有帮助。但缓存策略如果不分清页面类型和更新频率,就可能把过期内容反复返回给蜘蛛和访客。下面从几个常见缓存层做一次自查。
先分清缓存出现在哪些位置
排查时不要只盯着一个地方,同一份页面可能经过多层缓存:
- 浏览器缓存:通过 Cache-Control、Expires 等响应头控制,影响访客本地复用旧文件。
- CDN 缓存:边缘节点缓存 HTML、图片、JS、CSS,命中后不会回源。
- 反向代理或网关缓存:Nginx、Varnish 等层缓存整页或接口结果。
- 应用层页面缓存:CMS 或框架把渲染结果写入文件或内存。
- 对象缓存与数据库查询缓存:缓存数据片段,更新逻辑遗漏时会输出旧数据。
如果更新后蜘蛛仍看到旧页面,可以按“浏览器 → CDN → 反向代理 → 应用 → 数据”的顺序逐层排查,而不是直接怀疑抓取。
更新后要检查缓存是否真正失效
内容更新不只是保存文章,还需要触发对应缓存刷新。常见疏漏包括:
- 只清了首页缓存,栏目页和详情页仍保留旧列表。
- CDN 刷新只提交了 URL,但带参数地址或移动端地址没有覆盖。
- 对象缓存键没有随内容版本变化,更新后仍读取旧数据。
- 浏览器缓存时间设置过长,访客和蜘蛛长时间拿到旧文件。
- 多台服务器之间缓存不一致,回源命中不同节点。
比较稳妥的做法是:为内容更新建立固定的刷新流程,明确哪些地址需要刷新、由谁执行、多久验证一次。对于更新频繁的栏目,可以缩短缓存时间;对于长期不变的静态资源,可以设置较长缓存并配合文件名版本号。
缓存响应头自查要点
用 curl 或浏览器开发者工具查看响应头,重点关注以下字段:
- Cache-Control:是否有 max-age、s-maxage、no-cache、private 等指令,是否与页面性质匹配。
- Age:CDN 或代理返回的 Age 值可以判断缓存已存活多久。
- Expires:是否仍在用旧式过期时间,和 Cache-Control 是否冲突。
- ETag / Last-Modified:协商缓存是否可用,更新后是否变化。
- Vary:是否按 User-Agent、Accept-Encoding 等区分缓存,避免把移动端和桌面端混在一起。
如果 HTML 页面设置了很长的强缓存,又缺少版本化更新机制,蜘蛛和访客都可能反复看到旧内容。对资讯、商品、活动页这类更新频繁的页面,通常更适合较短的缓存时间,或者使用协商缓存。
验证时要注意方法和边界
验证缓存是否刷新,不能只看自己浏览器的一次刷新。可以尝试:
- 用不同网络或不同地区节点访问,观察返回内容是否一致。
- 用 curl 带上缓存控制头和不带头分别请求,比较响应。
- 查看 CDN 日志或回源日志,确认请求是否真正到达源站。
- 对更新后的 URL 做一次强制刷新,再等待片刻复查。
也不建议为了“保证新鲜”而全站关闭缓存。缓存全部关掉后,服务器压力会明显上升,响应变慢反而可能影响抓取效率。更合理的做法是按页面类型分级:静态资源长缓存加版本号,列表页和详情页短缓存,后台和登录态页面不缓存。
缓存不是越少越好,而是要让该新的内容及时更新,该省的压力继续省下来。
把缓存策略纳入日常站点运营检查,和 robots、sitemap、内部链接一样定期看一眼,能减少很多“明明更新了却像没更新”的误会。每次改版、换服务器或接 CDN 之后,也建议重新核对一遍缓存规则。