蜘蛛池知识

蜘蛛池入口页的条件请求:ETag、Last-Modified 与 304 的正确用法

蜘蛛池入口页会被反复抓取,条件请求能让服务器在内容未变时返回 304,减少重复传输。本文说明 Last-Modified 与 ETag 的配合方式、常见误配置,以及如何通过日志和 curl 排查 304 命中问题,帮助你把抓取资源用在真正需要更新的页面上。

蜘蛛池知识

蜘蛛池入口页的条件请求:ETag、Last-Modified 与 304 的正确用法

蜘蛛池入口页被反复抓取时,服务器每次都返回完整 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 无响应体。

配置与排查建议

  1. 静态入口页优先使用 Last-Modified,由文件系统时间或部署时间决定,不要手工改。
  2. 动态入口页使用内容哈希生成 ETag,例如标题、正文摘要、模板版本组合后取哈希;避免包含随机值。
  3. 保持同一 URL 的 ETag 生成逻辑稳定,跨服务器、跨 CDN 一致。
  4. 在访问日志中记录状态码,观察 304 比例。若长期为 0,检查请求头是否携带 If-None-Match/If-Modified-Since,或服务器是否忽略。
  5. 用 curl 模拟条件请求:先请求一次拿到 ETag 和 Last-Modified,再带上对应头请求,确认返回 304。
  6. 不要为了追求 304 比例而隐藏真实更新。内容确实变化时,应返回 200 并更新验证标识。

与抓取预算的关系

蜘蛛池入口页的抓取预算有限。304 可以减少带宽和解析开销,但不会增加蜘蛛对站点的抓取配额。真正影响 URL 发现的是入口页的链接结构、更新频率和站点可信度。把条件请求当作基础优化即可,不必过度设计。

条件请求配置正确时,蜘蛛能更高效地确认入口页状态;配置混乱时,反而会让蜘蛛反复拉取完整页面。定期核对响应头和状态码,比一次性设置更有效。