蜘蛛池知识

蜘蛛池入口頁的缓存驗證:Last-Modified、ETag 與 304 响應怎么用

蜘蛛池入口頁被反复抓取时,服務器每次返回完整内容並不划算。本文說明 Last-Modified、ETag 與 304 响應的作用,讲清蜘蛛二次来訪时缓存驗證能省什么,以及動態 ETag、假更新時間等常见誤区,並给出入口頁内容相對稳定时的設定建议。

蜘蛛池知识

蜘蛛池入口頁的缓存驗證:Last-Modified、ETag 與 304 响應怎么用

蜘蛛池入口頁被蜘蛛反复訪問时,服務器如果每次都返回完整的 HTML,會消耗不必要的带宽,也會让蜘蛛多下载一遍相同内容。缓存驗證头的作用是告诉蜘蛛:這個 URL 的内容有没有變化,没變就不用再拉全文。它不直接提升抓取量,但能减少無效传輸,让抓取记錄更干净。

缓存驗證的三個關键角色

HTTP 缓存驗證主要涉及两组头:响應里的 Last-Modified 和 ETag,請求里的 If-Modified-Since 和 If-None-Match。蜘蛛第一次抓取入口頁时,服務器返回 200 和這些驗證信息;再次抓取时,蜘蛛带上對應的請求头,服務器判断内容没變,就返回 304 Not Modified,不重复發送正文。

對蜘蛛池来说,入口頁通常是模板化頁面,正文變化不大。如果每個入口頁都稳定輸出 Last-Modified,蜘蛛再次来訪时就能用 304 快速確認,而不是重新下载整個頁面。但要注意,304 只是確認未修改,不代表蜘蛛會因此提高抓取频次或收錄概率。

304 响應在蜘蛛眼里是什么

蜘蛛看到 304,會把它当作“该 URL 上次抓取後没有變化”的信号。它可能更新一下抓取记錄,但不會把 304 当成新内容,也不會因為 304 就增加對站点的信任。有些站長誤以為返回 304 可以节省抓取预算,让蜘蛛去抓更多頁面,這個效果很有限:蜘蛛仍然要發起請求、建立连接、讀取响應头,省下的是正文传輸部分。

把 304 当作省流量的工具是合理的,把它当作“让蜘蛛多抓”的手段則會失望。

Last-Modified 怎么設定才有效

Last-Modified 應该反映頁面正文的真實修改時間,格式用 GMT,例如 Wed, 21 Oct 2025 07:28:00 GMT。常见错誤是每次請求都取目前時間,這样蜘蛛每次带 If-Modified-Since 回来,服務器都判断“有新修改”,于是永遠返回 200,缓存驗證形同虚设。

  • 如果入口頁内容由資料库生成,保留一個真實的更新時間字段,不要用脚本執行時間。
  • 頁面只有模板部分變化、正文没變时,可以考虑不改 Last-Modified,或者只改真正影响正文的部分。
  • 多個入口頁共用模板时,各自的 Last-Modified 應该獨立,不要所有頁面都指向同一個時間。

ETag 的用法與坑

ETag 是内容版本的标识,可以是文件哈希,也可以是資料库记錄的版本号。蜘蛛再次請求时带 If-None-Match,服務器比對後决定返回 304 還是 200。ETag 的常见坑是動態生成:比如用 inode、進程 ID 或随机數拼出来的 ETag,每次請求都不同,蜘蛛永遠等不到 304。

  • 用内容哈希或稳定版本号生成 ETag,避免把服務器狀態掺進去。
  • 如果使用 Nginx 等預設配置,注意預設 ETag 可能包含文件修改時間和大小,複製文件时容易變化。
  • Last-Modified 和 ETag 同时存在时,服務器通常按更嚴格的條件判断,两者都要稳定才有意义。

Cache-Control 與 Expires 不是一回事

Cache-Control 和 Expires 主要影响浏览器和中間缓存,對蜘蛛的二次抓取影响較小。蜘蛛不會因為 Cache-Control 里寫了很長的 max-age 就完全不来,它仍會按自己的調度訪問。不過,如果你用了 CDN,CDN 的缓存策略可能让蜘蛛拿到舊版本,或者让源站的 304 驗證被 CDN 拦截。這时需要区分“给浏览器缓存”和“给蜘蛛驗證”的目标,不要混在一起。

入口頁使用缓存驗證的實操建议

  1. 先確認入口頁内容确實稳定。如果入口頁每天都在改,304 很少出現,設定缓存头意义不大。
  2. 让 Last-Modified 和 ETag 来自同一個資料源,避免一個说没變、一個说變了。
  3. 在日誌里观察 304 的比例和蜘蛛的請求头。如果大量請求都没有带 If-Modified-Since 或 If-None-Match,可能是首次抓取,也可能是蜘蛛不按缓存規則走。
  4. 不要把 304 当成内容更新的替代品。頁面有實质變化时,應该正常返回 200 和新内容。
  5. 如果入口頁有多個 URL 指向同一内容,先處理好規范 URL,再考虑缓存驗證,否則蜘蛛可能在多個 URL 上分別驗證。

什么时候不建议用 304

如果入口頁经常需要吸引蜘蛛重新抓取,或者頁面内容确實在频繁變化,强行返回 304 可能让蜘蛛認為内容長期未更新。另一個场景是頁面已经下线或需要返回 410,這时應该用明确的错誤狀態碼,而不是 304。缓存驗證是優化传輸的工具,不是内容运营的策略。

總结来说,蜘蛛池入口頁的缓存驗證适合内容相對稳定的頁面。把 Last-Modified 和 ETag 設定正确,能让蜘蛛二次来訪时少下载重复内容,也能让服務器日誌更清晰地反映真實抓取。至于抓取频次和收錄,仍然取决于站点整体质量、内容更新和蜘蛛自身的調度,缓存头不能替代這些基础工作。