蜘蛛訪問的是 CDN,而不是源站
蜘蛛發起抓取时,請求先经過域名解析,再落到 CDN 的某個节点。节点有缓存就直接返回,没有才回源站取。也就是说,蜘蛛看到的内容很多时候不是源站的最新版本,而是某個节点上的缓存副本。這個中間层處理得好,抓取會更稳定;處理得不好,蜘蛛可能拿到错誤頁、舊内容,甚至在同一時間收到两種答案。
缓存版本不一致带来的抓取問题
多节点 CDN 下,各节点缓存的過期時間並不完全同步。内容更新後,一部分节点已经回源拿到新版,另一部分還在返回舊版。如果蜘蛛在不同時間、不同节点抓取同一個 URL,就可能形成两種頁面内容。搜尋引擎通常按 URL 归一處理,但多次不一致會影响它對頁面主题和更新時間的判断。
更麻烦的是缓存了不该缓存的東西:
- 301、302 被長時間缓存,之後修改跳轉目标,蜘蛛仍按舊跳轉走;
- 带參數的頁面被忽略參數缓存,不同參數返回同一份内容;
- 404 或错誤頁被缓存,源站已经恢复,蜘蛛還在拿舊狀態碼。
回源失敗與“看起来正常”的错誤
节点到源站的回源過程中,超时、连接被拒、源站 5xx 都可能發生。有些配置會在回源失敗时返回一個自定义错誤頁,狀態碼却是 200。蜘蛛拿到的是 200 和無意义内容,會把它当成正常頁面收錄,或者反复重抓。
反過来,回源失敗时如實返回 5xx,蜘蛛會视為临时問题,稍後重试,不會把错誤頁当成内容留下。区別在于狀態碼有没有真實反映结果。
缓存层不應该替源站“美化”狀態碼。200 就意味着有内容,5xx 才代表失敗,混在一起會让抓取判断失真。
节点差异怎么排查
不用等蜘蛛反馈,自己也能看到差异:
- 用 curl --resolve 把域名指向不同节点 IP,對比返回内容、Last-Modified 和 Age;
- 看响應头里的 X-Cache、Age、Via,判断這次是命中還是回源;
- 在服務器或 CDN 日誌里統計回源比例、5xx 比例和缓存命中率;
- 對關键頁面手動刷新缓存,观察蜘蛛後續抓取的變化。
配置上可以做的事
HTML 這類更新频繁的頁面,缓存時間不宜過長,可以用較短的 TTL 或 s-maxage;静態资源可以長缓存,但要让文件名随内容變化。错誤狀態、跳轉、带會话信息的响應,一般不要缓存。搜尋引擎的抓取請求是否绕過缓存,要看源站能不能承受,完全绕過缓存會把压力直接压到源站,反而增加超时和 5xx 的概率。
另外要確認回源地址稳定,源站返回的狀態碼、内容長度、编碼都正常。CDN 只是通道,抓取是否顺畅,最终還是取决于源站能不能及时给出正确响應。
小结
蜘蛛抓取经過 CDN 时,多了一层缓存判断。命中率高、回源正常、狀態碼如實,抓取路径就稳;缓存版本混乱、错誤頁被缓存、回源频繁失敗,蜘蛛就會在同一個地址上遇到不同结果。把缓存規則和回源行為對齐,比單纯追求命中率更有意义。