常见问题

蜘蛛池入口页被 CDN 缓存成旧版本,搜索蜘蛛抓到过期链接怎么办

入口页链接已经更新,搜索蜘蛛却一直抓到旧版本内容,这种情况多半出在 CDN 或反向代理缓存上。本文说明如何用响应头确认缓存命中、缓存为什么会把旧链接继续喂给搜索蜘蛛,以及清缓存、调 TTL、改缓存规则的先后顺序。

常见问题

蜘蛛池入口页被 CDN 缓存成旧版本,搜索蜘蛛抓到过期链接怎么办

蜘蛛池入口页最容易踩的一个坑,不是链接写错了,而是链接改对了、搜索蜘蛛却还是按老版本抓。表现通常是:你在入口页新增或替换了一批目标 URL,过一段时间去看日志,搜索蜘蛛访问的仍然是几天前甚至更早的那批链接。这种时候不要急着怀疑蜘蛛池本身失效,先把缓存这一层排掉。

一、怎么确认是缓存而不是别的

判断方法很简单:同一时刻对同一个入口页 URL 发几次请求,比较返回的 HTML 内容是否一致,再和源站直连的结果对比。如果源站已经更新,走域名访问拿到的还是旧 HTML,基本可以确定是 CDN、反向代理或对象存储缓存层在起作用。

看响应头

  • Age:大于 0 说明这份响应来自缓存,数值是它在缓存里待了多少秒。
  • X-Cache、CF-Cache-Status、X-Cache-Status 一类的字段:HIT 表示命中缓存,MISS 表示回源。
  • Cache-Control、Expires:决定缓存能存活多久,也就是你更新后要等多久才生效。
  • Last-Modified、ETag:和源站对比是否一致,能看出这份 HTML 到底是哪个版本。

换 UA 再测一次

有些缓存配置会把搜索引擎 UA 单独分流。用普通浏览器 UA 和常见的搜索蜘蛛 UA 各请求一次,看返回内容和缓存状态是否相同。如果两者不同,说明缓存规则里有按 UA 分版本的处理,这一层要单独查。

二、缓存为什么会把旧链接继续喂给搜索蜘蛛

常见原因有三个。一是缓存键只看 URL,不看内容版本,只要 TTL 没到期就一直返回旧 HTML;二是回源失败时启用了“过期内容继续提供”的策略,源站明明已经更新,缓存却因为回源超时把旧副本又吐了出去;三是多台边缘节点各自缓存,你只刷新了其中一台,其他节点还在用旧副本。

对搜索蜘蛛来说,后果不是“抓不到”,而是“抓到的是已经不存在的链接”。旧 URL 如果已经下掉,蜘蛛跟过去就是 404 或 410,等于把有限的抓取额度花在了废链接上,新链接的发现时间则被整体推后。

入口页这类页面更新频繁,通常不适合设置长缓存。把它当成需要即时生效的页面来配置,比事后反复清缓存省事得多。

三、按这个顺序处理

  1. 先清缓存,刷新全部边缘节点,不要只刷一台。
  2. 确认源站返回的已经是新 HTML,再去看缓存层是否同步。
  3. 检查缓存规则里 HTML 的 TTL。入口页建议用较短的缓存时间,或者对 HTML 直接不缓存。
  4. 确认回源失败时的兜底策略,关掉长期提供过期副本的选项。
  5. 更新完成后重新对入口页发起一次抓取请求,看响应头里的缓存状态和内容版本。

四、改配置时不要踩的两个坑

  • 不要为了搜索蜘蛛单独返回一份不一样的内容。按 UA 给蜘蛛定制页面容易被判定为作弊,而且一旦风控命中,损失比缓存旧链接大得多。
  • 不要给 HTML 加上很长的 Cache-Control: max-age。搜索蜘蛛会参考缓存头来决定多久之后再来,长缓存等于主动让它晚点回访。

五、长期怎么减少这类问题

把入口页和静态资源分开配置缓存策略:图片、CSS、JS 可以长期缓存,HTML 尽量短缓存或不缓存。每次批量更新链接之后,顺手做一次缓存刷新,并记录当前时间,方便之后对照蜘蛛访问日志里的内容版本。如果入口页是程序化生成、更新频率很高,可以从一开始就不走缓存,用性能换准确性,对抓取发现来说通常更划算。

最后提醒一句,缓存排查只能保证搜索蜘蛛看到的是最新内容,不能保证它一定抓取或收录。它解决的是“蜘蛛来了却看到旧页面”这类问题,剩下的还是取决于入口页本身的可抓取性和目标页的质量。