蜘蛛池入口頁被反复抓取时,服務器每次都返回完整 HTML,會消耗带宽,也让蜘蛛重复處理相同内容。條件請求是 HTTP 提供的协商机制:蜘蛛带上 If-Modified-Since 或 If-None-Match,服務器判断内容是否變化,未變化就返回 304。入口頁如果正确支持,蜘蛛可以用較少资源確認頁面狀態。
條件請求的基本流程
蜘蛛首次抓取时,服務器响應 200,並带上 Last-Modified 和/或 ETag。下次抓取时,蜘蛛會在請求头里带上 If-Modified-Since(值来自上次的 Last-Modified)或 If-None-Match(值来自上次的 ETag)。服務器比較後,若内容未變,返回 304 Not Modified,响應体為空;若變化,返回 200 和新内容。
- Last-Modified:基于時間,精度到秒,适合静態文件或更新有明确時間的頁面。
- ETag:基于内容标识,通常是哈希或版本号,能识別秒級以内的變化。
- 两者可同时存在,服務器按規則判断;蜘蛛一般會同时带上 If-None-Match 和 If-Modified-Since。
對蜘蛛池入口頁的實际意义
入口頁數量多、抓取频次高时,304 能减少响應体传輸。對搜尋引擎来说,304 表示頁面仍有效,抓取预算可以花在 URL 發現和内容變更上。需要注意:304 不是收錄或排名的保證,它只影响抓取阶段的资源消耗。如果入口頁本身是空壳或模板頁,304 也不會改變頁面质量。
304 是“节省重复抓取”的工具,不是“提升收錄”的手段。入口頁能否被發現和索引,仍取决于内容、連結和站点整体质量。
常见誤配置
- ETag 每次請求都變:有些程序把進程 ID、時間戳或請求 ID 拼進 ETag,導致每次都是新值。蜘蛛每次拿到的 ETag 不同,會認為内容變化,條件請求失效,每次都返回 200。
- Last-Modified 使用目前時間:動態頁面直接輸出 now() 作為最後修改時間,會让蜘蛛每次都認為頁面刚更新。结果是 200 全量返回,還可能让蜘蛛誤判更新频率。
- 多台後端服務器 ETag 不一致:负载均衡後不同机器生成的 ETag 算法或版本不同,蜘蛛轮询到不同节点时會看到交替的 ETag,導致 304 命中率下降。建议统一生成規則,或在入口层處理。
- 压缩與 ETag 的關系:部分服務器對压缩前後内容生成不同 ETag,若代理层和源站各自生成,也會造成不一致。需要確認 CDN 和源站的 ETag 策略。
- 304 响應誤带内容:少數配置會在 304 中仍返回 HTML 正文,這不符合規范,也可能让蜘蛛困惑。應保持 304 無响應体。
配置與排查建议
- 静態入口頁優先使用 Last-Modified,由文件系統時間或部署時間决定,不要手工改。
- 動態入口頁使用内容哈希生成 ETag,例如标题、正文摘要、模板版本组合後取哈希;避免包含随机值。
- 保持同一 URL 的 ETag 生成逻辑稳定,跨服務器、跨 CDN 一致。
- 在訪問日誌中记錄狀態碼,观察 304 比例。若長期為 0,检查請求头是否携带 If-None-Match/If-Modified-Since,或服務器是否忽略。
- 用 curl 模拟條件請求:先請求一次拿到 ETag 和 Last-Modified,再带上對應头請求,確認返回 304。
- 不要為了追求 304 比例而隐藏真實更新。内容确實變化时,應返回 200 並更新驗證标识。
與抓取预算的關系
蜘蛛池入口頁的抓取预算有限。304 可以减少带宽和解析開销,但不會增加蜘蛛對站点的抓取配額。真正影响 URL 發現的是入口頁的連結结构、更新频率和站点可信度。把條件請求当作基础優化即可,不必過度设計。
條件請求配置正确时,蜘蛛能更高效地確認入口頁狀態;配置混乱时,反而會让蜘蛛反复拉取完整頁面。定期核對响應头和狀態碼,比一次性設定更有效。