站点运营

站点运营:缓存与 CDN 回源自查,别让蜘蛛反复拿到旧页面

内容更新后自己刷新看到了新版,蜘蛛拿到的却可能是缓存里的旧页面。本文梳理 CDN、反向代理、应用缓存几层链路,讲清缓存键、TTL、回源兜底与主动刷新这几个关键点,并给出一份可以直接照着做的核对流程。

站点运营

站点运营:缓存与 CDN 回源自查,别让蜘蛛反复拿到旧页面

很多站点更新内容后,自己在浏览器里刷新看到了新版本,就默认搜索引擎也会看到同一份。实际上,中间可能隔着 CDN、反向代理、对象缓存、页面缓存等多层缓存,蜘蛛拿到的可能是几小时甚至几天前的旧页面。缓存本身不是问题,问题在于“你看到的”和“蜘蛛看到的”不一致,而且没人定期核对。

先搞清楚缓存链路有哪几层

自查之前,先把页面从源站到访问者之间经过的缓存层列出来,常见的有:

  • 浏览器缓存:由 Cache-Control、Expires 控制,对搜索引擎影响相对小。
  • CDN 边缘节点缓存:按缓存键存放副本,TTL 到期才回源。
  • 反向代理 / 网关缓存:Nginx、Varnish 一类,规则写错容易长期缓存 HTML。
  • 应用层页面缓存:框架或插件生成的静态化文件、对象缓存。
  • 数据库与查询缓存:一般不影响最终 HTML,但会拖慢回源速度。

任何一层把 HTML 缓存住,都可能造成蜘蛛与真实内容脱节。

三个最常见的坑

1. HTML 被当成静态资源长期缓存

把 .html 或动态路径设置成 TTL 7 天、30 天,上线初期看不出问题,内容一改就出问题。首页、栏目页、列表页这类更新频繁的页面,TTL 应该短一些,或者配合主动刷新机制。

2. 缓存键里带了不该带的维度

有些配置会把 User-Agent、Cookie、Referer 一起作为缓存键。结果就是同一个 URL 在不同 UA 下生成多份副本,蜘蛛拿到的那份可能恰好是旧版本,或者是一个被裁剪过的页面。要确认缓存键只包含必要维度,并检查 Vary 头有没有把爬虫引向错误的副本。

3. 回源失败后继续返回旧副本

源站短暂 5xx 时,CDN 若配置了“过期后继续提供旧内容”,访问者看不到报错,但蜘蛛可能长时间拿到过期页面。这类策略要写清开启条件和最长保留时间,别让它无声无息地拖上几周。

自查怎么做

  1. 选 5–10 个代表性 URL:首页、最新栏目页、刚更新的详情页、一个长期不变的页面。
  2. 用带蜘蛛 UA 的请求抓取响应头,记录 Age、X-Cache、Cache-Control、Last-Modified、ETag 等字段。
  3. 和源站直连的响应做对比,重点看内容长度、正文关键句、时间戳是否一致。
  4. 更新一篇内容,观察各层缓存多久后同步,记录实际延迟。
  5. 确认主动刷新通道可用:CDN 刷新入口、应用层缓存清理方式,是否有人会用、有没有权限。
判断标准很朴素:把蜘蛛拿到的 HTML 存下来,和你预期的最新版本逐段比一次。不一致,就是缓存没管好。

日常运营里的几条习惯

  • 重要更新走“先刷新缓存、再观察”的流程,别发完就等自然过期。
  • 给缓存 TTL 做一张表,按页面类型分层:首页和列表页短 TTL,详情页可稍长。
  • 回源异常时的兜底策略写清楚,最长保留时间要有上限。
  • 把缓存核对放进每周巡检,和日志抽样一起做。
  • 改版或迁移前,先确认缓存清理顺序:应用缓存 → 源站 → CDN 边缘。

缓存优化的目标不是让命中率越高越好,而是让“命中”和“正确”同时成立。对站点运营来说,蜘蛛看到的版本是否等于你正在维护的版本,比省下多少回源流量更重要。