常见問题

入口頁被 CDN 缓存後,搜尋蜘蛛拿到的可能是舊版本

蜘蛛池入口頁明明更新了目标 URL,日誌里却迟迟看不到新抓取,問题常常出在缓存层:CDN、Nginx 或框架級頁面缓存會把舊版 HTML 反复交给搜尋蜘蛛。本文說明缓存错位的常见场景、如何用响應头和 UA 對比来確認問题,以及入口頁缓存時間该怎么设、什么时候需要主動刷新缓存。

常见問题

入口頁被 CDN 缓存後,搜尋蜘蛛拿到的可能是舊版本

维護蜘蛛池入口頁时常會遇到一種情况:後台明明加了新一批目标 URL,搜尋蜘蛛日誌里却迟迟看不到對應抓取,甚至十几天後抓到的還是老版本的連結列表。這不一定說明入口頁失效,很可能是缓存层把舊 HTML 反复交给了搜尋蜘蛛。

缓存為什么會让搜尋蜘蛛看到舊頁面

搜尋蜘蛛本质上是一個不带 Cookie、不發 POST、請求行為比較規律的 HTTP 客戶端。如果入口頁前面挂着 CDN、Nginx 缓存、對象存储或框架級頁面缓存,那么第一次抓取把 HTML 存進缓存之後,後續所有請求——包括搜尋蜘蛛的請求——都會拿到同一份副本,直到缓存過期或被主動刷新。你在後台更新的連結列表,在缓存過期前蜘蛛是看不到的。

三種常见的“缓存错位”场景

  • CDN 把 HTML 也缓存了。很多 CDN 預設只缓存静態资源,但如果入口頁被设成“缓存全部”,或者缓存規則寫得過宽,HTML 也會被長時間缓存,刷新周期可能從几小时到几天不等。
  • 頁面缓存没有按 URL 区分。某些程序按栏目或模板做整頁缓存,你更新了 A 列表,结果返回的却是 B 列表或舊模板,蜘蛛抓到的連結和目标對不上。
  • 源站更新了,邊缘节点没回源。缓存時間還没到,回源規則又比較宽松,蜘蛛就一直被邊缘节点挡在外面,看到的是舊副本。

怎么確認是缓存問题而不是抓取問题

  1. 用浏览器無痕窗口打開入口頁,再用 curl 带上搜尋蜘蛛的 UA 請求同一地址,對比两次返回的 HTML 是否一致。不一致基本可以判断存在 UA 维度的缓存分流。
  2. 看响應头里的 AgeX-CacheCF-Cache-Status 這類字段,出現 HIT 說明命中的是缓存副本。
  3. 把日誌里蜘蛛的抓取時間和入口頁實际更新時間放在一起看。如果抓取時間晚于你的更新時間,返回内容却是舊的,属于缓存問题;如果抓取時間明顯滞後于更新時間,更可能是抓取频率本身偏低。
  4. 手動刷新一次缓存,再观察一到两個抓取周期,看新連結是否出現在日誌里。

减少影响的几個常規做法

  • 入口頁這類需要频繁更新連結的 HTML,尽量設定較短的缓存時間,或在缓存規則里直接排除。
  • 為入口頁配置合理的 Cache-Control 以及 ETagLast-Modified,让缓存层在内容變化时能拿到新版本。
  • 更新連結後主動刷新一次缓存,而不是干等缓存自然過期。
  • 把“入口頁能否被稳定讀取”列進日常巡检,而不是出了問题才回头查。
缓存不會直接决定收錄,但它會决定搜尋蜘蛛能不能看到你新加的那批 URL。

几個常见誤解

有人觉得只要 URL 提交接口返回成功、入口頁用浏览器能打開,蜘蛛就一定能看到新連結。實际上接口只负责把地址递出去,抓取时拿到什么内容,取决于缓存层给的是哪一份副本。也有人認為缓存只影响蜘蛛不影响用戶,其實用戶看到舊内容的概率是一样的,只是用戶不會去翻日誌。

排查這類問题时,建议把入口頁的“返回内容版本”和“被抓取時間”一起记錄下来。長期對比之後,你會更容易判断抓取量波動是缓存造成的,還是抓取策略本身發生了變化。