搜尋抓取

CDN 缓存與蜘蛛抓取:邊缘节点返回的内容,蜘蛛到底拿到哪一版

蜘蛛請求的往往不是源站,而是最近的邊缘节点。缓存命中率、缓存键设計、Vary 头以及 TTL 設定,都會影响响應速度、狀態碼,甚至决定蜘蛛看到的是哪一版頁面。本文梳理缓存层影响抓取的常见路径,並给出观察和排查方法。

搜尋抓取

CDN 缓存與蜘蛛抓取:邊缘节点返回的内容,蜘蛛到底拿到哪一版

很多站点排查抓取問题时只盯着頁面和連結,却忽略了中間那一层:CDN 與缓存。蜘蛛請求的往往不是源站,而是离它最近的邊缘节点。节点返回缓存還是回源结果,會直接影响响應時間、狀態碼,甚至决定它看到的是哪一版頁面。這层配置没問题时几乎没人注意,一旦有偏差,抓取日誌里的表現就會顯得很反常。

蜘蛛拿到的是缓存,還是回源结果

對搜尋引擎来说,它只關心這次請求有没有在合理時間内拿到正确内容,至于内容由缓存還是源站提供,它並不知情。但對站点来说,這两條路径的成本差別很大:缓存命中时响應通常在几十毫秒,回源則要经過網絡往返、應用處理和資料库查询。如果蜘蛛抓取的 URL 恰好都落在未命中的部分,源站压力會被放大,抓取變慢、超时、5xx 都可能跟着出現。

更需要注意的是缓存可能把错誤一起缓存住。如果某次回源时源站返回了 500 或一個空頁面,而缓存把它当成正常响應存了下来,後續蜘蛛在有效期内拿到的都會是這個错誤结果。這類問题看源站日誌很正常,只有看邊缘节点才看得出来。

哪些配置會悄悄影响蜘蛛看到的頁面

Vary 與 Cookie

如果响應头里带了 Vary: CookieVary: User-Agent,缓存會被切成很多份,命中率急剧下降,甚至等于没有缓存。有些站点為了做訪問統計或語言判断,對每個訪客下發不同的 Cookie,蜘蛛請求时也带上一份,于是每次都回源,抓取体驗和普通用戶完全不同。

缓存键與查询串

缓存键通常包含完整 URL,也包含查询串。带參數的 URL 會各占一份缓存,命中率被稀释。反過来,如果缓存键忽略了查询串,那么 /list?page=1 和 /list?page=5 可能返回同一份缓存,蜘蛛抓到的分頁内容就會重复或错乱。两種做法都會让抓取结果和预期不一致。

缓存過期與半新半舊

較短的 TTL 意味着蜘蛛每次来訪都可能触發回源,抓取越频繁,源站越紧張。較長的 TTL 則可能让蜘蛛反复看到舊版本,新内容迟迟不被感知。没有绝對正确的值,但内容更新频率和缓存時間要對得上,列表頁和詳情頁通常不该用同一套策略。

和抓取节奏配合的几個做法

  • 對静態资源和變化不频繁的頁面設定較長 TTL,把回源压力留给真正需要實时計算的頁面。
  • 避免缓存键被無意义的參數打散,比如跟踪參數、會话 ID、時間戳。
  • 明确哪些响應可以被缓存:只缓存 200,屏蔽 4xx 與 5xx,避免错誤被固化。
  • 在源站压力可控的前提下,對搜尋引擎来源的請求保持稳定的响應能力,不要因為單獨限速造成大批超时。
  • 頁面更新後按需刷新相關缓存,而不是等 TTL 自然過期。

如何判断問题出在缓存层

  1. 用相同 URL 连續請求几次,观察响應头中的缓存命中标识、Age、X-Cache 等字段是否變化。
  2. 對比邊缘节点與直接回源源站的响應時間、狀態碼和正文長度。
  3. 查看抓取日誌中同一 URL 的狀態碼是否出現周期性波動,比如每隔一段時間集中出現 5xx。
  4. 检查响應头里是否存在 Vary: Cookie 之類的字段。
  5. 確認缓存規則是否把參數、UA 或 Cookie 纳入了缓存键。
缓存层不是抓取的外部因素,它决定了蜘蛛實际拿到什么。配置上的小偏差,往往比内容問题更容易造成抓取波動。

把 CDN 和缓存当成抓取鏈路的一部分来看:它既影响蜘蛛能否在合理時間内拿到頁面,也影响它拿到的是不是正确的版本。定期對照邊缘节点日誌和抓取日誌,比只看源站狀態碼更容易發現那些看起来正常、實际不正常的問题。