不少站長把精力放在内容和结构上,却忽略了两者之間的一個中間层:CDN 與服務器缓存。蜘蛛来抓頁面时,拿到的不一定是你刚刚更新的那一版。缓存配得好,响應更快、源站更轻松;配得不好,蜘蛛可能長期看到舊内容、错誤版本,甚至拿到一個和 URL 對不上的頁面。
先分清缓存的三個层級
排查之前先明确:一次抓取可能经過几层缓存。分不清层級,問题就容易在团队之間来回推。
- 浏览器與本地缓存:主要影响真實用戶,對蜘蛛影响有限,但错誤的 Cache-Control 值會被沿用到下游。
- CDN 邊缘节点缓存:最常见的問题来源,缓存键决定了什么样的請求算“同一個頁面”。
- 源站缓存與對象存储:頁面生成层或反向代理缓存,如果更新後没有联動失效,蜘蛛取到的仍然是舊 HTML。
常见問题與自查方向
1. 缓存键把不同頁面混成一個
如果缓存键只包含路径,忽略了查询參數、語言、设备類型或登入狀態,就可能出現 A 頁面的内容被返回给 B 請求。對蜘蛛尤其明顯:它按 URL 抓取,却拿到另一套内容,URL 與頁面的對應關系就乱了。
- 检查带參數的 URL 是否被统一缓存成同一份结果。
- 检查多語言、多地区版本是否用 Vary 或缓存键做了区分。
- 检查移動端與桌面端是否共用了同一份缓存。
2. 過期時間設定過長
把 HTML 文档的缓存時間设成几天甚至更久,更新就很难被及时看到。静態资源(图片、CSS、JS)适合長缓存配合文件名哈希,但 HTML 通常更适合較短的 TTL,或者配合發布时主動刷新。
3. 清缓存只清了一层
發布新内容後只刷新了首頁,栏目頁、标簽頁、詳情頁可能仍是舊版本。蜘蛛恰好先抓到這些頁面,就會把過期内容带走。建议把“發布後需要刷新的 URL 清單”固化下来,明确包含列表頁和聚合頁。
4. 错誤頁被缓存下来
源站短暂故障时返回的 5xx,如果被 CDN 缓存,可能在故障恢复後繼續對外提供一段時間。這類响應本不该被缓存,需要在配置里明确排除。
一份可执行的自查流程
- 用命令行工具分別請求 CDN 地址和源站地址,對比响應头中的缓存标识與内容摘要。
- 记錄關键頁面的 Age、Cache-Control、X-Cache 等字段,確認命中在哪一层。
- 更新一篇文章,立即重新請求该 URL,观察返回的是否為新版本。
- 再用带參數的 URL、移動端 UA、多語言路径各請求一次,確認没有串頁。
- 检查 5xx、404 等異常响應是否带上了可缓存的头部。
和蜘蛛的抓取记錄對照着看
缓存造成的影响,往往會体現在抓取记錄里:同一 URL 连續多次拿到相同内容、發布後長時間不變、不同 URL 返回高度相似的内容。把 CDN 訪問日誌與源站日誌對照,能較快判断是缓存没刷新,還是頁面本身就没有更新。
還需要提醒一点:缓存只是加速手段,不會改變頁面本身的质量和结构。如果标题、正文、内鏈長期没有實质變化,刷新缓存也不會带来什么不同。
把缓存配置当作站点结构的一部分来维護,比出了問题再临时清一次要省事得多。