搜尋抓取

CDN 缓存與蜘蛛抓取:命中缓存时蜘蛛拿到的是哪一版頁面

蜘蛛抓取时往往先经過 CDN 或反向代理,缓存命中會直接返回副本。本文說明缓存如何影响蜘蛛看到的頁面版本,哪些缓存头需要留意,以及怎样排查缓存與源站不一致的問题,避免新内容被舊缓存挡住。

搜尋抓取

CDN 缓存與蜘蛛抓取:命中缓存时蜘蛛拿到的是哪一版頁面

很多人看抓取日誌时只盯着狀態碼和 URL,却忽略了一個中間层:CDN 或反向代理。蜘蛛的請求通常不會直接落到源站,而是先到邊缘节点。如果缓存命中,蜘蛛拿到的是一份已经存在的副本,而不是源站刚刚生成的新頁面。對蜘蛛来说,响應同样是 200,但内容和新鲜度可能已经不同。

蜘蛛抓取经過缓存时發生了什么

一個正常的抓取請求大致會走這样的路径:蜘蛛發起請求,DNS 解析到 CDN 节点,节点检查本地是否有可用缓存。有則直接返回,没有則回源,源站返回後再按缓存規則决定是否存下来。整個過程對蜘蛛是透明的,它不會区分“這是缓存版”還是“這是源站版”。

問题在于,缓存有生命周期。源站更新了标题、正文或结构化資料,缓存副本却可能還是几小时前甚至几天前的版本。蜘蛛如果在這段時間抓取,看到的就是舊内容。它不會因為源站已经更新就自動再抓一次,下一次刷新取决于缓存過期和蜘蛛自己的調度。

响應头里藏着缓存线索

Age 與 X-Cache

Age 表示這份响應在缓存里已经存了多久。Age 為 0 或很小,說明大概率是刚回源或刚寫入缓存;Age 很大,說明蜘蛛拿到的是一份舊副本。X-CacheCF-Cache-Status 這類自定义头也常用 HIT、MISS、EXPIRED 来告诉你命中情况。排查时可以先看這些头,再决定是不是缓存導致蜘蛛看到舊内容。

Cache-Control 與 s-maxage

Cache-Control 里的 max-ages-maxage 决定了缓存能存多久。s-maxage 专门作用于共享缓存,也就是 CDN 這類节点。如果 HTML 頁面设了很長的 s-maxage,源站更新後蜘蛛仍可能持續拿到舊版。静態资源可以長缓存,但 HTML 通常需要更短的有效期,或者依赖主動刷新。

Vary 头會分裂缓存

如果响應里带 Vary: User-Agent,CDN 會按 User-Agent 分別缓存。蜘蛛的 UA 和普通用戶不同,可能命中一個獨立的缓存桶,或者完全绕過缓存。前者容易让蜘蛛長期看到某個特定版本,後者則让缓存失去减轻源站压力的意义。還有 Vary: Cookie 的情况,處理不好會出現缓存污染。

哪些缓存設定容易挡路

  • HTML 頁面缓存時間過長,更新後蜘蛛仍讀到舊内容。
  • 把 404、410 或重定向响應也缓存下来,错誤狀態被反复返回。
  • 按 UA 或 Cookie 分裂缓存,蜘蛛和用戶看到不同版本。
  • 缓存了带參數 URL,篩選頁、排序頁被大量存储,抓取时命中空壳。
  • 源站已经刪除頁面,缓存仍返回 200,形成事實上的软 404 残留。

怎么排查缓存與源站不一致

  1. 用蜘蛛的 User-Agent 請求目标 URL,记錄响應头和正文摘要。
  2. 直接請求源站 IP 或绕過 CDN,對比同一 URL 的响應头和正文。
  3. 看 Age 和命中狀態,判断這次抓取是 HIT 還是回源。
  4. 检查 Cache-Control、Vary、Expires,確認 HTML 的缓存策略是否合理。
  5. 更新重要頁面後主動刷新缓存,再观察蜘蛛下一次抓取拿到什么。
  6. 對经常變動的列表頁、詳情頁設定較短 TTL,或采用按需刷新。

排查时不要只看一次结果。缓存命中具有随机性,多节点、多地区可能表現不同。要在日誌或监控里持續观察,而不是靠單次 curl 下结论。

缓存能减压,但不能替代抓取策略

缓存命中可以减少源站压力,让服務器在蜘蛛集中抓取时更稳。這一点對站点运营是好事。但缓存不會改變蜘蛛是否繼續抓、是否索引,也不會自動让新 URL 被發現。抓取预算、内鏈路径、Sitemap 和内容质量仍然是基础。把缓存当成“让蜘蛛多抓”的手段,容易失望。

让蜘蛛看到和用戶一致、足够新的頁面版本,比追求缓存全命中更重要。

日常可以做的,是保證 HTML 缓存不過期到失真,静態资源放心長缓存,重要更新主動刷新,並定期用蜘蛛视角检查响應头。這样既减轻服務器负担,也不會让蜘蛛長期停在舊版本上。