蜘蛛池入口页通常会被蜘蛛反复回访,服务器日志里能看到大量重复请求。如果每次回访都返回完整内容,抓取预算和带宽都会被浪费。缓存头的作用是让抓取端知道内容有没有变化,而不是阻止蜘蛛来访。理解 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 更新提示结合起来看,才能判断入口页的抓取是否健康。任何单一指标都不足以说明问题。