搜索抓取

蜘蛛再次来访时,304 与 200 该回哪个

蜘蛛再次抓取同一 URL 时,服务器返回 304 还是 200,直接影响抓取效率和带宽开销。本文解释条件请求的触发条件、Last-Modified 与 ETag 的写法、常见错误配置,以及如何从日志判断缓存头是否生效,帮助站点把抓取资源用在真正变化的内容上。

搜索抓取

蜘蛛再次来访时,304 与 200 该回哪个

蜘蛛第一次抓取某个 URL 后,过一段时间还会再来。再次来访时,服务器返回 200 还是 304,看起来只是状态码不同,但会影响到这次抓取的带宽开销,也会影响蜘蛛把时间花在哪里。

再次抓取时的条件请求

如果服务器此前返回过 Last-Modified 或 ETag,蜘蛛下次请求同一 URL 时,通常会带上 If-Modified-Since 或 If-None-Match。这叫做条件请求。服务器收到后,可以判断内容有没有变化:没变化就回 304,变化了就回 200 并附上新内容。

304 省的是带宽,不是抓取次数

304 响应没有正文,传输体积小,对服务器和蜘蛛都更轻。但要注意,它仍然是一次 HTTP 请求,仍然会占用一个抓取名额。所以 304 不会“节省抓取预算”到让蜘蛛少来,它节省的是带宽和解析成本。真正决定蜘蛛来不来的,还是内容更新频率、站点整体质量和服务器响应速度。

什么时候应该返回 200

  • 页面正文、标题、结构化数据有实际变化;
  • 模板改了,导致页面主要文本或内链发生变化;
  • 此前没有正确返回 Last-Modified 或 ETag,无法做条件判断;
  • 内容虽然没变,但状态码从 404 恢复为正常页面。

如果内容确实变了,服务器却回 304,蜘蛛会继续使用旧副本,新内容可能迟迟得不到更新。

常见的配置错误

  • Last-Modified 固定不变:有些程序把时间写成安装时间,之后不再更新,蜘蛛会误以为页面从未变过。
  • ETag 每次请求都变:比如把进程 ID 或随机数拼进 ETag,蜘蛛每次都得重新拿完整内容,304 形同虚设。
  • 动态页面一律回 200:内容没变也回 200,带宽浪费,蜘蛛拿到一堆重复内容。
  • 304 之后又带正文:状态码和响应体不一致,可能让抓取工具判断异常。

和内链、Sitemap 的关系

304 只影响单个 URL 的重复抓取。Sitemap 里的 lastmod 是另一条线索,它告诉蜘蛛“这个 URL 大概什么时候变过”。如果 lastmod 写的是很久以前,而服务器每次都回 304,两条线索一致,蜘蛛会降低回访频率。如果 lastmod 频繁变动,服务器却总回 304,蜘蛛会逐渐不再信任 lastmod。内链结构也会影响:一个长期不变的栏目页,如果每次都回 304,蜘蛛仍然会顺着它的链接去发现新 URL,但不会反复读取正文。

从日志里看缓存头是否生效

在服务器访问日志里,可以统计同一个 URL 的 200 和 304 比例。如果一个更新不频繁的页面,蜘蛛来访十次有九次都是 200,说明 Last-Modified 或 ETag 可能没设置好。可以重点检查:

  1. 响应头里有没有 Last-Modified 或 ETag;
  2. 同一个 URL 连续两次请求,ETag 是否稳定;
  3. 内容更新后,Last-Modified 是否跟着变;
  4. 304 响应的比例在稳定内容上是否合理。
不要为了“少让蜘蛛抓”而强行返回 304。蜘蛛需要看到真实的内容变化,强行回 304 只会让新内容延迟被发现。

把 304 和 200 用对,核心是让服务器如实告诉蜘蛛“内容变没变”。缓存头稳定、状态码诚实,蜘蛛就能把有限的抓取次数用在更有变化、更值得抓的 URL 上。