站点运营

站点运营:缓存與 CDN 策略自查,別让過期内容一直喂给蜘蛛

缓存能减轻服務器压力,也會在内容更新後繼續對外返回舊版本。本文從浏览器缓存、CDN 邊缘缓存、服務端頁面缓存三层梳理自查方法,包括缓存头與缓存键設定、發布後的刷新與驗證流程,以及如何判断蜘蛛實际拿到的是哪一版内容。

站点运营

站点运营:缓存與 CDN 策略自查,別让過期内容一直喂给蜘蛛

内容改完了,自己刷新浏览器看到的是新版,但蜘蛛抓回去的仍然是几天前的舊頁面——這種情况在啟用 CDN 或頁面缓存的站点上並不少见。缓存本身是站点运营里必要的一环,問题往往出在缓存策略没有跟着内容更新的节奏走。

為什么蜘蛛更容易拿到舊缓存

普通訪客多數带着浏览器缓存訪問,按一次刷新可能就绕過了缓存;而蜘蛛請求通常是一個全新的、干净的請求,它會正常命中 CDN 邊缘节点或服務端頁面缓存。如果這些缓存没有及时失效,蜘蛛拿到舊版本反而比訪客更稳定。另一個常见原因是缓存键設定不当,比如只按 URL 缓存,却忽略移動端 UA、Cookie 或語言參數,導致不同版本的内容互相覆盖。

先分清站点上到底有几层缓存

  • 浏览器缓存:由 Cache-Control、Expires、ETag 控制,影响重复訪問的用戶,也影响部分抓取工具的重复請求。
  • CDN 邊缘缓存:节点就近返回内容,更新後需要主動刷新或等待 TTL 到期。
  • 服務端頁面缓存與對象缓存:常见于 CMS 插件、反向代理(如 Nginx fastcgi_cache、Varnish)。
  • 静態化與資料库查询缓存:静態文件不重新生成,前台就會一直停留在生成前的版本。

自查清單

  1. 检查 HTML 文档的缓存头。頁面 HTML 一般不适合設定過長的强缓存,用較短的 max-age 配合 ETag 或 Last-Modified,让蜘蛛能拿到較新的版本;图片、CSS、JS 等带指纹的静態资源可以设長缓存。
  2. 確認 CDN 缓存键包含必要维度。至少区分 HTTP 與 HTTPS、移動端與桌面端(如果返回不同 HTML)、多語言或地区版本。
  3. 排查是否有頁面在 CDN 上被设為永久缓存,或自定义 TTL 過長(例如 30 天)。内容型頁面通常不适合這種設定。
  4. 检查缓存插件是否把登入態、表單结果、個性化推荐等私有内容缓存成了公共版本。
  5. 確認發布内容後是否有自動刷新(purge)動作。不少 CMS 插件只在儲存时刷新目前 URL,首頁、栏目頁、列表頁不會跟着更新。
  6. 检查 CDN 的“忽略查询字符串”設定,避免把带參數與不带參數的頁面混成同一份缓存。
  7. 確認回源失敗时节点的行為。部分 CDN 在源站異常时會繼續返回過期缓存,排查問题时容易被誤導。

更新後怎么驗證蜘蛛看到的是哪一版

不要只看自己的浏览器。可以用命令行請求並带上明确的缓存绕過头,观察响應头里的 Age、X-Cache、CF-Cache-Status 等字段,判断這次返回是命中缓存還是回源。再與 CDN 控制台的刷新记錄對照,確認刷新确實生效。修改重要頁面後,間隔一段時間再抓一次,確認内容已经稳定為新版。

如果站点有日誌,可以留意蜘蛛訪問目标頁面时的响應大小與狀態碼,並與源站日誌比對,判断它命中的是节点缓存還是源站。這比單纯看“蜘蛛来過没有”更有參考價值。

两個常见誤区

  • 以為清空浏览器缓存就等于全網更新。浏览器只是最外层,节点缓存和服務端缓存還在。
  • 把缓存 TTL 设得越長越好。對内容频繁更新的站点,長 TTL 省下的那点回源压力,遠不如内容不一致带来的麻烦。
缓存策略的目标不是让内容永遠缓存,而是让该缓存的缓存、该更新的更新。發布流程里最好把刷新與驗證寫成固定步骤,而不是靠临时想起。

落到流程上

把缓存刷新與内容發布绑定:發布後自動刷新相關 URL(含首頁、栏目頁、列表頁),再抽检一两個頁面確認生效。大改版或批量更新前,提前和负责 CDN 的同事確認刷新方式與生效時間。日常监控方面,可以定期抽查核心頁面的响應头,確認缓存没有長期停留在舊版本上。