常见问题

入口页被 CDN 缓存住,搜索蜘蛛看到的还是旧链接怎么办

入口页更新了链接,搜索蜘蛛却一直抓到旧版本 HTML,多数是 CDN 或反向代理缓存造成的。本文说明如何用响应头、日志和源站对比确认缓存问题,给出缓存策略、主动刷新和分层排查的具体做法,并说明哪些情况下不需要改缓存。

常见问题

入口页被 CDN 缓存住,搜索蜘蛛看到的还是旧链接怎么办

蜘蛛池入口页的职责是让搜索蜘蛛不断发现新的目标 URL。如果入口页前面挂了 CDN 或反向代理,缓存策略没配好,搜索蜘蛛拿到的可能一直是几天前那份 HTML,新加的链接根本没机会被看到。这通常不是蜘蛛池本身失效,而是缓存层把请求挡在了源站外面。

缓存为什么会卡住 URL 发现

CDN 和反向代理一般会按路径、查询串缓存页面,部分配置还会按 UA 或 Cookie 区分版本。入口页链接更新后,源站内容变了,但边缘节点上的副本还在 TTL 内,请求直接返回旧 HTML。搜索蜘蛛拿到旧页面,自然只能看到旧链接。

典型表现是:自己在浏览器里刷新能看到新链接,日志里搜索蜘蛛的抓取记录也有,但目标 URL 迟迟不进抓取队列。

先确认是不是缓存导致

  1. curl -I 请求入口页,看响应头里有没有 AgeX-CacheCF-Cache-Status 之类字段。有 Age 且数值较大,基本可以判定命中缓存。
  2. 对比源站和 CDN 返回的 HTML 长度或内容哈希,不一致就说明拿到的是缓存副本。
  3. 把搜索蜘蛛的 UA 单独拿出来请求一次,看是否返回了另一份内容,有些配置对爬虫走了单独的缓存规则。
  4. 翻访问日志,确认搜索蜘蛛抓到的版本和源站当前版本对应不上。

缓存可能不止一层

从搜索蜘蛛到源站,中间可能经过 CDN 边缘节点、CDN 中间层、源站前面的 Nginx proxy_cache,甚至应用自身的页面缓存。只清掉一层,剩下的层还会返回旧内容。排查时按请求链路逐层验证:先看边缘节点响应头,再绕过 CDN 直连源站 IP 请求,最后检查应用层有没有单独缓存入口页。

调整方向

  • 入口页不缓存或短缓存。把 Cache-Control 设成 no-cache 或很短的 max-age,让边缘节点频繁回源。
  • 更新后主动刷新。每次改完链接就调用 CDN 的刷新接口清掉入口页缓存,别等 TTL 自然过期。
  • 动态页和静态资源分开。图片、CSS 可以长缓存,入口页 HTML 保持回源。
  • 避免按 UA 分版本。给搜索蜘蛛单独返回一份内容容易踩到 cloaking 的边界,维护成本也高。
  • 链接更新走固定流程。先刷新缓存,再确认回源内容正确,最后才看日志里的抓取记录。

哪些情况不用动缓存

如果入口页本身几乎不更新,链接长期固定,缓存反而能降低源站压力,这时没必要强行回源。判断标准很简单:入口页的链接集合是否还在变化。不再变化,缓存就是帮手;还在频繁增删,缓存就是阻力。

两个常见误区

  • 把缓存当成唯一原因。缓存清了目标 URL 还是没动静,说明问题在链接可抓取性、robots 规则或目标页响应状态上。
  • 为了绕过缓存给搜索蜘蛛单独开一份内容。短期可能看到抓取变化,长期风险不小,也不容易维护。
入口页的重点不是内容多新鲜,而是搜索蜘蛛每次来能不能看到当前的链接集合。缓存让这两者脱节时,排查优先级要排在改模板前面。

改完之后怎么看效果

调整后不要立刻下结论。观察一到两周日志,看搜索蜘蛛抓入口页时返回的 HTML 是否已经是最新版本,目标 URL 有没有出现首次抓取记录。如果入口页抓取正常、内容也是最新的,但目标 URL 依然没有动静,那问题在别处,需要回到链接可抓取性、robots 规则和目标页响应状态上继续排查。