站点运营

站点运营:缓存與 CDN 自查,別让蜘蛛拿到過期副本

蜘蛛抓到的頁面,未必是你刚發布的那一版。浏览器缓存、CDN 邊缘节点、反向代理只要多留了一份舊副本,蜘蛛就可能按舊内容做判断。本文從响應头排查、源站與邊缘對比、该不该長缓存的资源分類,到發布流程里的刷新動作,给出一份可执行的自查清單。

站点运营

站点运营:缓存與 CDN 自查,別让蜘蛛拿到過期副本

蜘蛛来抓頁面时,拿到的未必是你刚發布的那一版。中間可能隔着浏览器缓存、CDN 邊缘节点、反向代理、對象存储,任何一层多留了一份舊副本,蜘蛛就會按舊内容做判断。缓存本身不是問题,問题在于“缓存了多久、缓存了什么、怎么失效”這三件事没管清楚。

缓存最容易引發的四類抓取問题

  • 舊 HTML 里留着舊連結:頁面改版後,缓存副本仍指向已刪除的 URL,蜘蛛顺着爬過去,撞上一串 404。
  • canonical 指向過期地址:缓存的是上一版的 head,正本指向已经 301 的舊地址,信号自相矛盾。
  • 狀態碼被缓存:某個节点在源站维護期間缓存了 503 或 404,源站恢复後邊缘還在返回舊狀態。
  • 节点之間内容不一致:A 节点是新的,B 节点是舊的,蜘蛛抓到哪一版基本靠运气。

自查:先看响應头,再比源站和邊缘

1. 用命令行看缓存痕迹

對目标 URL 發一次 HEAD 請求,重点看這几個字段:

  • Age:大于 0 說明這份内容来自中間层,數字越大越舊。
  • Cache-Control:確認 max-age 是给 HTML 的還是给静態资源的,两者不该用同一套策略。
  • X-Cache、CF-Cache-Status 之類的厂商头:直接告诉你 HIT 還是 MISS。
  • Last-Modified 與 ETag:用来判断邊缘手里的副本是不是目前版本。

2. 源站與邊缘各取一份做對比

直连源站 IP 並带上正确的 Host 头取一份,再通過域名走 CDN 取一份,對比标题、canonical、正文首段是否一致。连續請求几次,观察 Age 是否在增長,判断是否命中缓存。這一步能快速暴露“源站已更新、邊缘還没動”的情况。

3. 多节点抽查

用不同地区的探测节点請求同一個 URL,记錄狀態碼和内容指纹。如果各地差异明顯,多半是刷新没推全,或者某些节点回源失敗後返回了舊副本。站点規模不大时,抽查十個左右节点就够用。

哪些该長缓存,哪些不该

  • 静態资源(JS、CSS、图片、字体):可以長缓存,但要配文件名指纹。改版靠換文件名,而不是靠刷新缓存。
  • HTML 文档:不建议長缓存。可以用較短的 max-age 搭配协商缓存,保持内容新鲜度。
  • robots.txt、sitemap、RSS:這類文件更新後需要立刻生效,不宜設定長缓存。
  • 301、302 跳轉:跳轉規則調整後要清理邊缘缓存,否則舊跳轉還會被执行一段時間。

要固定進發布流程的動作

  1. 發布完成後,主動刷新首頁、相關栏目頁、本次更新的詳情頁,以及 sitemap 文件。
  2. 涉及換域名、換路径、改 canonical 的改版,做一次全量清理,而不是等缓存自然過期。
  3. 把“刷新缓存”寫進發布清單,和内容上线放在同一批操作里执行。
  4. 源站维護或临时下线期間,避免让邊缘把 5xx 当成正常响應長期儲存;维護結束後再复查一遍狀態碼。
  5. 记錄缓存策略和节点配置的變更時間,出問题时能和抓取日誌對上。
蜘蛛看到的是哪個版本,取决于它落到哪個节点、那個节点手里是哪一份副本。缓存策略的目标不是“最快”,而是让用戶和蜘蛛拿到同一個目前版本。

最後提醒一句:如果 HTML 响應头里寫着 max-age 很大的 public 缓存,等于告诉所有中間层“很久別来問我”。按资源類型区分缓存时長,比事後一條條清理要省事得多。定期花十分钟看看响應头,往往比事後追查抓取異常轻松。