蜘蛛池知识

蜘蛛池入口頁與 CDN 缓存:蜘蛛抓到的可能是過期頁面

入口頁部署、解析、狀態碼都排查過,蜘蛛却仍讀到舊版本,問题常出在 CDN 缓存這一层。本文說明缓存键包含哪些维度、如何用响應头判断是否命中缓存、入口頁更新後的刷新與预热顺序,以及几類常见誤区和相對稳妥的做法。

蜘蛛池知识

蜘蛛池入口頁與 CDN 缓存:蜘蛛抓到的可能是過期頁面

入口頁部署完成,域名解析正常,狀態碼、robots、sitemap 都检查過一遍,但你在日誌里發現:蜘蛛确實来了,讀到的却不是最新版本。這類問题里有相当一部分並不在源站,而在源站前面的那层 CDN 缓存。

CDN 為什么會让蜘蛛看到舊頁面

開啟 CDN 之後,蜘蛛請求的往往不是你的服務器,而是离它最近的一個邊缘节点。该节点如果已经缓存過這個 URL 的响應,就會直接把缓存副本返回,源站根本收不到這次請求。對蜘蛛来说,它拿到的就是你上次回源时的那份 HTML,包括里面的連結清單、标题和正文。

入口頁通常是連結清單型頁面,改動频繁但体积很小,恰好最容易被缓存:内容小、命中率高、回源少,缓存节点自然倾向于一直留着。

缓存键里有哪些维度

路径與查询參數

  • 預設情况下,带不同查询參數的 URL 一般被当成不同的缓存對象,也可能被配置成忽略參數。
  • 如果入口頁靠參數分頁或分類,忽略參數會導致不同頁面拿到同一份缓存内容。

Host、UA 與 Cookie

  • 部分 CDN 支持按 UA、设备或 Cookie 分片缓存,蜘蛛的 UA 可能命中一個獨立副本。
  • 如果分片規則恰好把蜘蛛归到某個很少被刷新的分组,它看到的版本會比普通用戶更舊。

怎么判断命中缓存還是回源

  • 看响應头:Age 大于 0 基本就是缓存副本;X-Cache、CF-Cache-Status、X-Via 之類的字段會直接标出 HIT 或 MISS。
  • 對照源站訪問日誌:如果某些入口頁長期没有回源记錄,但蜘蛛仍在持續抓取,多半說明它一直在讀缓存。
  • 用命令行带蜘蛛 UA 請求,並指定不同节点 IP,观察返回内容是否一致、是否落後于源站。
不要為了驗證是否命中缓存而用带随机參數的 URL 去請求。蜘蛛會把這些參數当成新地址,最後你手里多出来的是一堆重复的入口頁。

入口頁更新後的處理顺序

  1. 先在源站確認新版本已经可以正常訪問。
  2. 提交刷新(purge)该路径,必要时连目錄一起刷。
  3. 刷新後主動請求一次做预热,避免蜘蛛第一個請求就打回源站造成超时。
  4. 對经常改動的入口頁,适当下調 TTL,让缓存副本的過期時間短一些。

几個常见誤区

  • 改了源站就等于全網生效:不同节点的過期時間並不完全同步。
  • 把缓存当成“稳定”:入口頁需要更新时,稳定反而意味着蜘蛛看不到新連結。
  • 用時間戳參數强行破缓存:短期看似有效,長期會制造大量内容相同的 URL。
  • 只關注 HTML 缓存:robots.txt、sitemap,甚至 301 跳轉本身也可能被缓存,改動它們时同样要刷新。

相對稳妥的做法

  • 入口頁與站内普通頁面分開配置缓存策略,前者 TTL 短一些,後者可以長一些。
  • 把“更新内容”和“刷新缓存”寫進同一條操作流程,避免只做一半。
  • 定期抽查几個入口頁的 Age 和响應内容,確認蜘蛛看到的是目前版本。
  • 缓存配置發生變更时记錄時間和涉及的路径,方便事後對照日誌排查。

CDN 缓存本身不是問题,問题在于它常常被漏在检查清單之外。当入口頁、解析、狀態碼都排查過一遍仍然不對时,把缓存這一层單獨拿出来看,往往能解释“蜘蛛来了,却没看到新東西”這種現象。