常见問题

蜘蛛池入口頁返回 304 或走 CDN 缓存,搜尋蜘蛛還會解析目标 URL 吗

入口頁走 CDN 或開啟服務端缓存後,搜尋蜘蛛经常拿到 304 响應。304 並不是拒绝抓取,它只是让搜尋蜘蛛沿用本地缓存副本,連結仍然會被解析;但如果缓存副本是舊的,新加的目标 URL 就可能一直發現不了。本文說明 304 狀態下連結發現的實际逻辑,以及缓存導致新連結被挡住的常见原因和排查方向。

常见問题

蜘蛛池入口頁返回 304 或走 CDN 缓存,搜尋蜘蛛還會解析目标 URL 吗

入口頁為了省带宽,经常會走 CDN 或者開啟服務端缓存。這时候搜尋蜘蛛来抓取,拿到的可能不是完整的 200 响應,而是 304 Not Modified。不少站長會問:既然頁面没有真正传内容,那頁面上的目标 URL 還會不會被發現?

304 不等于“没抓”,連結仍来自缓存副本

304 的含义是“你本地那份副本還是最新的,不用重新传了”。搜尋蜘蛛收到 304 时,會直接使用自己索引里儲存的那份 HTML,然後照常解析里面的連結。也就是说,只要上一次抓取时入口頁里已经寫了目标 URL,這次連結發現通常依然有效,不會因為 304 而中断。

問题往往出在“上一份副本”上:如果副本是舊的,里面還没有你新加的目标 URL,那這次 304 就等于让搜尋蜘蛛繼續用舊頁面,新連結自然發現不了。

哪些情况會让新加的目标 URL 被缓存挡住

  • Last-Modified 或 ETag 設定不對:頁面内容改了,但修改時間或内容指纹没變,搜尋蜘蛛判断“没變化”,繼續使用舊副本。
  • CDN 缓存時間過長:入口頁更新後,邊缘节点還在返回舊内容,搜尋蜘蛛拿到的也是這一份。
  • 错誤版本被缓存:比如把 404、502 或临时跳轉的响應缓存下来,並設定了較長的缓存時間。
  • 按 UA 区分内容却没設定 Vary:不同 UA 拿到不同版本,缓存可能把几個版本混在一起。
  • 入口頁是動態生成的列表:每次輸出的顺序或分頁不同,被缓存住的那一版可能刚好不包含你要的目标 URL。

怎么判断是不是缓存造成的“發現不了”

看日誌比猜更可靠。重点看搜尋蜘蛛請求入口頁时返回的狀態碼:如果長期只有 304,說明它一直在用缓存副本,這时需要確認這份副本里到底有没有目标 URL。也可以換不同 UA 請求一次入口頁,對比返回的 HTML 是否一致;再清掉對應 URL 的 CDN 缓存後重新請求,看内容是否發生變化。

實操上可以這样做

  1. 入口頁内容有增删时,同步更新 Last-Modified,或让 ETag 随内容變化。
  2. 给入口頁單獨設定較短的缓存時間,不要和图片、静態资源共用一套長缓存策略。
  3. 避免把 4xx、5xx 以及临时跳轉的响應缓存下来。
  4. 如果同一個 URL 對不同 UA 返回不同内容,正确設定 Vary: User-Agent。
  5. 更新入口頁後主動刷新缓存,並繼續观察一段時間日誌里的狀態碼和實际抓取内容。

两点容易被忽略的细节

一是缓存副本的“年龄”。搜尋蜘蛛手里的副本可能来自几天甚至更早,更新入口頁後不要指望马上生效。二是多個入口頁共用同一套缓存規則时,一處出問题會成片出現同样的現象,排查时按規則分组看,比一個頁面一個頁面找要快得多。

另外要分清發現和抓取。304 影响的是入口頁上的連結能否被解析出来,而目标 URL 最终會不會被繼續抓取,還取决于它自身的响應速度、robots 規則以及搜尋蜘蛛当次的抓取安排。

304 本身不妨碍連結發現,真正决定结果的是搜尋蜘蛛手里那份缓存副本是不是最新的。