搜尋抓取

CDN 缓存與蜘蛛抓取:蜘蛛拿到的頁面版本,和你看到的可能不一样

蜘蛛抓取通常先经過 CDN 邊缘节点,缓存命中和回源返回的内容可能不是同一版。本文說明缓存键、Vary 與多节点差异如何影响蜘蛛看到的 HTML,並给出一套從請求复現到缓存刷新的排查顺序,帮助站点先把抓取版本稳定下来。

搜尋抓取

CDN 缓存與蜘蛛抓取:蜘蛛拿到的頁面版本,和你看到的可能不一样

蜘蛛抓取站点时,請求通常不會直接打到源站,而是先落到 CDN 或反向代理的邊缘节点。這意味着蜘蛛拿到的 HTML,有可能是缓存副本,也可能是回源後的最新版本。两者不一致时,就會出現“自己打開是新的、蜘蛛抓到還是舊的”這類情况,URL 發現和内容判断都會跟着受影响。

抓取請求在鏈路里的位置

一次抓取大致经過:DNS 解析、邊缘节点接入、缓存查找、命中則直接返回、未命中則回源、源站生成 HTML、再按缓存策略寫回节点。蜘蛛只看到最後返回的那份内容,中間是命中還是回源、来自哪個节点,它都感知不到。

所以排查抓取問题时,先把“蜘蛛看到的是哪一版”確認清楚,往往比反复修改正文更有效。

缓存键决定了蜘蛛拿到哪一版

邊缘节点用缓存键判断两個請求算不算同一個頁面。缓存键通常包含 URL 路径和查询字符串,但有些配置還會把請求头纳入進来,比如 Accept-Encoding、User-Agent 或 Cookie。

  • 按 UA 区分缓存:如果站点给蜘蛛和普通訪客返回不同内容,缓存键里最好带上對應标识,否則两邊會互相覆盖。
  • Cookie 參與缓存:带會话 Cookie 的請求绕過缓存,回源生成的内容可能夹带個性化模块,蜘蛛抓到的版本和匿名訪客並不相同。
  • 查询參數被忽略:忽略參數的配置會把带參數的地址和無參數地址归為一份缓存,蜘蛛遍歷參數變体时可能反复拿到同一份 HTML。

常见的不一致场景

  • 發布新頁面後只刷新了首頁缓存,新連結所在的栏目頁仍是舊副本,蜘蛛顺着舊列表走,找不到新 URL。
  • 缓存里存着舊的狀態碼,某個 URL 已经從 404 變成 200,邊缘仍在返回舊响應。
  • 多节点部署、回源到不同後端,各邊缘节点上的版本不一致,蜘蛛不同轮次抓到不同结果。
  • 移動版與桌面版共用缓存键,两邊 HTML 混在一起返回。
  • Vary 头缺失,同一 URL 因 Accept-Encoding 不同而出現压缩與未压缩两份缓存。

排查顺序

  1. 用蜘蛛的 User-Agent 向目标 URL 發起請求,儲存返回的 HTML。
  2. 看响應头里的缓存标识字段,確認是命中還是回源,以及缓存寫入時間。
  3. 同一 URL 從不同網絡出口、不同节点各請求一次,比對内容是否一致。
  4. 若不一致,先检查缓存键配置、Vary 設定和回源規則,而不是先怀疑正文质量。
  5. 調整缓存策略後,再观察服務器日誌里蜘蛛的抓取時間與請求结果是否同步變化。
缓存問题往往表現為“抓取不稳定”:同一頁面时好时坏。先把内容版本固定住,再谈抓取频率和收錄,顺序才對。

發布與刷新的配合

新頁面或改版頁面發布时,比較稳妥的做法是:内容先上线,主動刷新相關 URL 的缓存(含列表頁和詳情頁),再提交 Sitemap 或补充站内入口連結。顺序反了,蜘蛛很可能在缓存還是舊版本时就来訪,抓到的列表里没有新連結。

對更新频繁的列表頁,可以設定較短的缓存時間;對變動少、体积大的静態资源,缓存時間可以長一些。關键是让蜘蛛在合理的抓取間隔内,能稳定讀到目前有效的版本。

最後一点:缓存配置本身不會让頁面被抓取,也不承诺带来排名,它的作用是保證蜘蛛每次来訪拿到的内容是一致的、可判断的。版本一致之後,URL 發現、抓取路径和後續的内容评估才有稳定的基础。