蜘蛛池入口頁通常會被蜘蛛反复回訪,服務器日誌里能看到大量重复請求。如果每次回訪都返回完整内容,抓取预算和带宽都會被浪費。缓存头的作用是让抓取端知道内容有没有變化,而不是阻止蜘蛛来訪。理解 Cache-Control、ETag 與 Last-Modified 在抓取鏈路里的表現,能帮你更合理地安排入口頁的更新與回訪节奏。
缓存头在蜘蛛抓取中的角色
当蜘蛛請求入口頁时,服務器返回 200 和頁面内容,同时附带响應头。下一次蜘蛛再請求同一 URL 时,可能會带上 If-None-Match 或 If-Modified-Since。如果服務器判断内容没變,就返回 304,蜘蛛認為頁面未更新,可能降低回訪频率。這個過程不是“蜘蛛被拒绝”,而是双方在確認内容狀態。
Cache-Control 的 max-age 與抓取間隔
max-age 告诉缓存多久内不用回源。對蜘蛛来说,設定過長可能减少抓取,設定過短則每次回源,服務器压力大。建议根據入口頁更新频率設定合理值。不要為了“让蜘蛛常来”而故意设 no-cache,短期可能看到更多請求,長期會浪費抓取预算。
ETag 與 Last-Modified 的配合
ETag 基于内容生成,Last-Modified 基于時間。两者一致时,304 更可靠。如果 ETag 每次請求都變,比如動態生成或包含時間戳,蜘蛛會認為内容一直變化,導致重复抓取。检查服務器配置时,要留意這類细节。
常见配置誤区
- 把 Cache-Control 设為 no-store 或 no-cache,期望蜘蛛每次都抓完整内容。
- ETag 由随机數或進程 ID 生成,導致每次請求都不同。
- Last-Modified 使用目前時間而不是文件修改時間。
- 多個 CDN 节点返回不同的 ETag,让蜘蛛难以判断。
- 用 200 返回空内容代替 304,浪費带宽和抓取机會。
怎么驗證缓存头是否合理
- 用 curl -I 查看响應头,確認 Cache-Control、ETag、Last-Modified 存在且稳定。
- 连續請求两次,第二次带上 If-None-Match,看是否返回 304。
- 检查日誌中 304 與 200 的比例。如果全是 200,說明缓存头可能没生效。
- 观察蜘蛛回訪频率,结合日誌時間戳判断變化。
- 如果用了 CDN,確認回源和邊缘节点都遵循缓存規則。
使用建议
缓存头是配合抓取预算的工具,不是作弊手段。入口頁内容稳定时,让蜘蛛拿到 304 是好事;内容频繁更新时,再調整 max-age。不要為了“骗蜘蛛”而制造虚假的 304,一旦内容實际變化但返回 304,蜘蛛會错過更新。
缓存头的目标是让抓取端准确判断“有没有新東西”,而不是單纯减少請求次數。
最後,把缓存头、日誌、sitemap 更新提示结合起来看,才能判断入口頁的抓取是否健康。任何單一指标都不足以說明問题。