蜘蛛池知识

蜘蛛池入口頁的缓存與 CDN 配置:蜘蛛為什么總是抓到舊頁面

入口頁做了調整却没被重新抓取,很多时候不是蜘蛛不来,而是 CDN 或反向代理把舊版本挡住了。本文梳理缓存头、缓存键、Vary 與回源降級等常见配置,說明它們如何影响蜘蛛看到的内容,並给出排查步骤與配置建议。

蜘蛛池知识

蜘蛛池入口頁的缓存與 CDN 配置:蜘蛛為什么總是抓到舊頁面

蜘蛛池里的入口頁经常需要小步調整:換标题、換内鏈、換承接方向。調整之後是否被蜘蛛重新抓取,除了看服務器响應,還取决于一层容易被忽略的東西——缓存與 CDN。很多运营者看到的“蜘蛛不来了”“抓到的還是舊内容”,根源不在入口頁本身,而在缓存把新版本挡住了。

缓存為什么會影响蜘蛛的判断

蜘蛛抓取时看到的不是源站最新的 HTML,而是 CDN 邊缘节点或反向代理返回的那一份副本。如果副本還是几天前的頁面,蜘蛛拿到的就是舊标题、舊連結、舊跳轉目标。它不會报错,只是按舊版本處理,入口頁的更新在检索层面等于没有發生。

常见来源

  • Cache-Control 的 max-age 设得太長,邊缘节点長時間不回源;
  • Expires 與 max-age 冲突,不同节点理解不一致;
  • CDN 侧開啟了“忽略源站缓存头”或對頁面做了强制缓存;
  • 缓存键包含 cookie 或全部查询參數,同一個 URL 产生多份副本。

几個容易踩的坑

第一,把 404 和 301 缓存下来。入口頁做替換时,舊 URL 返回 301,如果 CDN 缓存了這個跳轉,即使源站後来改回 200,邊缘节点仍會把跳轉返回给蜘蛛。第二,缓存降級頁。回源超时时 CDN 返回上一個版本或一個預設頁,有些預設頁是 200 狀態,蜘蛛會把它当成正常内容處理。第三,Vary 設定過细。按 User-Agent 分缓存後,蜘蛛和普通用戶的副本不同步,排查时很容易看错對象。

Vary 與 UA 缓存

部分 CDN 支持按 User-Agent 区分缓存。如果给蜘蛛單獨缓存了一份内容,你在浏览器里看到的是新的,蜘蛛看到的可能還是舊的。除非有明确的移動端适配需求,否則不建议對入口頁做 UA 维度的缓存区分。

怎么排查“蜘蛛抓到舊内容”

  1. 用與蜘蛛一致的 UA 請求入口頁,把返回内容與源站做對比;
  2. 看响應头里的 Age、X-Cache、CF-Cache-Status 之類的字段,判断是否命中缓存;
  3. 對比 Last-Modified 與源站文件的修改時間;
  4. 在源站日誌里確認蜘蛛請求有没有真正到達源站,還是全被邊缘节点接走了;
  5. 必要时對單個 URL 刷新缓存,再观察下一次抓取拿到的是什么版本。

配置建议

  • 入口頁這類需要频繁調整的頁面,缓存時間设短一些,或采用“短缓存加主動刷新”的方式;
  • 404、410、301、302 等狀態不要長期缓存;
  • 回源失敗时不要返回 200 的降級頁,宁可返回 5xx 让蜘蛛下一轮再来;
  • 缓存键尽量只保留 URL 路径和必要參數,剔除追踪參數;
  • 改過内容的入口頁,改完後主動刷新一次缓存,不要等自然過期;
  • 把缓存刷新纳入日常运营動作,尤其是批量替換承接頁的时候。
缓存不是抓取問题,而是内容版本問题。蜘蛛抓到的不是新内容时,先確認它到底看到了什么。

需要說明的是,缓存配置只能保證蜘蛛拿到的是目前版本,至于這份版本會不會被抓取、會不會進入索引,還取决于入口頁本身的质量、站点整体狀態和抓取预算。把缓存当成一個“版本一致性”的检查环节,會更接近實际运营中的情况。