缓存和 CDN 本来是为了让用户打开更快、让源站少扛一点压力。但在站点运营里,它们也可能变成一个隐蔽的坑:你明明更新了标题、正文或栏目结构,搜索引擎蜘蛛抓到的却还是几天前的版本。更麻烦的是,这种问题在浏览器里不一定看得出来,因为你自己访问时可能命中了另一份缓存。
蜘蛛看到的页面,可能和你看到的不一样
用户访问页面时,通常会经过浏览器缓存、CDN 边缘节点、反向代理缓存、应用层页面缓存等多层结构。蜘蛛没有浏览器缓存,但它同样会经过 CDN 和反向代理。如果这些层缓存了 HTML,而缓存又没有及时刷新,蜘蛛拿到的就是旧页面。
常见现象是:后台已经发布新内容,前台用无痕窗口也能看到,但蜘蛛抓取记录里仍然显示旧标题,或者抓取到的页面大小和现在不一致。这时不要急着怀疑蜘蛛“不来”,先确认它拿到的是哪个版本。
缓存本身不是问题,缓存和内容更新不同步才是问题。
容易出问题的几个缓存位置
- CDN 的 HTML 缓存:有些站点为了提速,把 HTML 也设成长时间缓存。静态资源可以这样做,HTML 要谨慎。
- 反向代理缓存:Nginx 的 proxy_cache、Varnish 等如果规则写得太宽,可能把登录态、不同参数、不同 UA 的请求混在一起返回。
- 应用层页面缓存:一些 CMS 或插件会生成静态 HTML 文件。更新内容后如果没有清缓存,源站返回的就已经是旧文件。
- 浏览器缓存头:Cache-Control 和 Expires 设置过长,虽然主要影响用户,但也会让排查时产生误判。
自查方法:用不同身份请求同一个 URL
不要只看浏览器。可以用命令行或在线工具,分别模拟普通用户和蜘蛛的 UA,观察响应头和正文版本。
- 用 curl -I 查看响应头,重点看 Cache-Control、Age、X-Cache、CF-Cache-Status、X-Proxy-Cache 等字段。
- 用普通 UA 和搜索引擎蜘蛛 UA 各请求一次,对比返回的 HTML 是否一致,尤其是标题和更新时间。
- 在 URL 后加一个随机查询参数,绕过 CDN 缓存,看源站真实返回的内容。
- 如果带参数和不带参数返回不同,说明缓存规则可能把参数当成了不同资源,或者源站对参数处理不一致。
- 把 CDN 返回的页面大小与源站返回的页面大小做对比,差异明显时优先检查缓存。
需要提醒的是,不要用带随机参数的 URL 去判断蜘蛛看到的版本。蜘蛛抓取的是规范 URL,随机参数只能帮你确认源站内容。
把缓存刷新和内容更新排进同一个流程
与其事后排查,不如把缓存处理写进日常更新流程。内容发布后,除了检查前台,还要确认缓存层已经刷新。
- 更新重要页面后,主动刷新 CDN 和反向代理缓存,不要只等过期时间。
- HTML 的缓存时间可以短一些,或者使用 stale-while-revalidate 之类的策略,让蜘蛛和用户都能较快拿到新版本。
- 静态资源用文件名指纹或版本号,放心设置长缓存,不必每次全站刷新。
- 更新站点地图中的 lastmod,让蜘蛛知道哪些页面确实变了。
- 观察抓取日志里蜘蛛请求的状态码和响应大小,如果长时间不变,值得回查缓存。
别走到另一个极端
也有人因为担心缓存问题,干脆把全站缓存关掉。这样源站压力会变大,蜘蛛抓取时响应变慢,反而影响抓取效率。合理的做法是区分对待:图片、CSS、JS 等静态资源可以缓存久一点;HTML 和接口数据根据更新频率设置较短缓存,并保留主动刷新通道。
站点运营里的很多问题,并不是某个设置绝对错误,而是它和内容更新节奏脱节了。缓存与 CDN 自查的意义,就是让蜘蛛每次来访时,看到的都是你当前真正想让它看到的那一版。