蜘蛛池知识

蜘蛛池入口页的缓存与 CDN 配置:蜘蛛为什么总是抓到旧页面

入口页做了调整却没被重新抓取,很多时候不是蜘蛛不来,而是 CDN 或反向代理把旧版本挡住了。本文梳理缓存头、缓存键、Vary 与回源降级等常见配置,说明它们如何影响蜘蛛看到的内容,并给出排查步骤与配置建议。

蜘蛛池知识

蜘蛛池入口页的缓存与 CDN 配置:蜘蛛为什么总是抓到旧页面

蜘蛛池里的入口页经常需要小步调整:换标题、换内链、换承接方向。调整之后是否被蜘蛛重新抓取,除了看服务器响应,还取决于一层容易被忽略的东西——缓存与 CDN。很多运营者看到的“蜘蛛不来了”“抓到的还是旧内容”,根源不在入口页本身,而在缓存把新版本挡住了。

缓存为什么会影响蜘蛛的判断

蜘蛛抓取时看到的不是源站最新的 HTML,而是 CDN 边缘节点或反向代理返回的那一份副本。如果副本还是几天前的页面,蜘蛛拿到的就是旧标题、旧链接、旧跳转目标。它不会报错,只是按旧版本处理,入口页的更新在检索层面等于没有发生。

常见来源

  • Cache-Control 的 max-age 设得太长,边缘节点长时间不回源;
  • Expires 与 max-age 冲突,不同节点理解不一致;
  • CDN 侧开启了“忽略源站缓存头”或对页面做了强制缓存;
  • 缓存键包含 cookie 或全部查询参数,同一个 URL 产生多份副本。

几个容易踩的坑

第一,把 404 和 301 缓存下来。入口页做替换时,旧 URL 返回 301,如果 CDN 缓存了这个跳转,即使源站后来改回 200,边缘节点仍会把跳转返回给蜘蛛。第二,缓存降级页。回源超时时 CDN 返回上一个版本或一个默认页,有些默认页是 200 状态,蜘蛛会把它当成正常内容处理。第三,Vary 设置过细。按 User-Agent 分缓存后,蜘蛛和普通用户的副本不同步,排查时很容易看错对象。

Vary 与 UA 缓存

部分 CDN 支持按 User-Agent 区分缓存。如果给蜘蛛单独缓存了一份内容,你在浏览器里看到的是新的,蜘蛛看到的可能还是旧的。除非有明确的移动端适配需求,否则不建议对入口页做 UA 维度的缓存区分。

怎么排查“蜘蛛抓到旧内容”

  1. 用与蜘蛛一致的 UA 请求入口页,把返回内容与源站做对比;
  2. 看响应头里的 Age、X-Cache、CF-Cache-Status 之类的字段,判断是否命中缓存;
  3. 对比 Last-Modified 与源站文件的修改时间;
  4. 在源站日志里确认蜘蛛请求有没有真正到达源站,还是全被边缘节点接走了;
  5. 必要时对单个 URL 刷新缓存,再观察下一次抓取拿到的是什么版本。

配置建议

  • 入口页这类需要频繁调整的页面,缓存时间设短一些,或采用“短缓存加主动刷新”的方式;
  • 404、410、301、302 等状态不要长期缓存;
  • 回源失败时不要返回 200 的降级页,宁可返回 5xx 让蜘蛛下一轮再来;
  • 缓存键尽量只保留 URL 路径和必要参数,剔除追踪参数;
  • 改过内容的入口页,改完后主动刷新一次缓存,不要等自然过期;
  • 把缓存刷新纳入日常运营动作,尤其是批量替换承接页的时候。
缓存不是抓取问题,而是内容版本问题。蜘蛛抓到的不是新内容时,先确认它到底看到了什么。

需要说明的是,缓存配置只能保证蜘蛛拿到的是当前版本,至于这份版本会不会被抓取、会不会进入索引,还取决于入口页本身的质量、站点整体状态和抓取预算。把缓存当成一个“版本一致性”的检查环节,会更接近实际运营中的情况。