不少蜘蛛池入口站為了扛訪問量、分散 IP,會把域名挂到 CDN 或前置一层反向代理。這本身没有問题,但缓存一旦配得随意,蜘蛛從不同节点看到的就可能是不同版本的頁面——你在源站改過的東西,蜘蛛未必看得到。
缓存命中时,蜘蛛看到的是上一次的頁面
蜘蛛請求入口頁时會带上自己的 UA,但多數 CDN 預設並不区分 UA,缓存的是第一個触發回源的版本。如果這個版本来自普通訪客訪問,比如带地域跳轉、带活動横幅的 HTML,蜘蛛拿到的就是這份被改造過的内容。
- 頁面主体内容與源站不一致,連結被條件判断吞掉
- 本该跳轉的頁面被缓存成 200,源站其實已经 404
- 頁面里的外鏈被替換成本地域名,锚文本對不上
节点差异:同一個 URL,不同机房不同结果
CDN 是分节点缓存的。回源時間與過期時間不一致时,A 节点可能已经是新版本,B 节点還是几天前的舊版本。蜘蛛被調度到哪個节点並不由你决定,于是日誌里的抓取结果时好时坏,很难复現。
如果同一入口頁在日誌里出現两種完全不同的抓取结果,先別急着怀疑蜘蛛,先查缓存。
缓存污染:不该被缓存的响應被存了下来
- 源站返回 5xx 或 302,被 CDN 按错誤缓存策略存了一個周期,蜘蛛反复拿到同一個错誤。
- 带查询參數的 URL 大量生成缓存副本,等于给蜘蛛造了一批内容相同的重复頁。
- 缓存键没带 Vary: User-Agent,移動版與桌面版互相覆盖,只留最後一份。
對比排查的几步
- 用多地拨测工具或指定节点 IP 抓取,横向比對响應体是否一致。
- 看 X-Cache、Age、CF-Cache-Status 這類响應头,確認命中的是缓存還是源站。
- 临时關掉缓存直连源站,先確認源站本身輸出正确,再回来看缓存层。
- 在日誌里按 URL 聚合,观察同一頁面的响應長度是否稳定。
入口頁的缓存配置建议
入口頁通常量不大、變化不频繁,其實没必要做長缓存。比較稳妥的做法是:
- 入口頁 HTML 设短缓存或不缓存,源站更新後主動 purge,別等自然過期。
- 静態资源可以長缓存,但 HTML 不要跟着一起長缓存。
- 缓存键区分移動端與桌面端,避免两種版本互相覆盖。
- 明确 404、5xx、跳轉的缓存策略,別让错誤頁面長期驻留。
什么时候可以放心缓存
如果入口頁是纯静態、内容基本不變、没有地域跳轉和登入態,缓存能明顯减轻源站压力,對蜘蛛的响應也更稳定。反過来,只要頁面有一處會随訪客變化,缓存就要格外小心,通常宁可让它回源。
缓存不是收錄開關,它只决定蜘蛛看到什么。看到的是不是你想让它看到的,這件事得自己確認。