蜘蛛池知识

蜘蛛池入口页的缓存头与压缩:304 响应、ETag 与 gzip 怎么配

入口页的缓存头、ETag 与压缩配置看似是服务器层面的细节,却会直接影响蜘蛛的抓取节奏。本文梳理 Cache-Control、Last-Modified、304 响应与 gzip 编码之间的关系,列出多机 ETag 不一致、重复压缩、CDN 缓存异常状态码等常见问题,并给出可执行的核对方式。

蜘蛛池知识

蜘蛛池入口页的缓存头与压缩:304 响应、ETag 与 gzip 怎么配

入口页被蜘蛛抓取时,服务器返回的响应头往往比页面正文更早被解析。缓存、校验、压缩这三类头部如果配置得不一致,结果可能是蜘蛛反复下载同一份内容,也可能是它拿到一份过期甚至残缺的快照。这些设置不决定页面会不会被收录,但会直接影响抓取节奏和抓取预算的消耗。

三类响应头分别影响什么

缓存头:影响蜘蛛愿不愿意回头

Cache-Control、Expires、Age 描述的是这份内容在多久之内不会变化。对入口页来说,比较稳妥的做法是给一个较短的新鲜期,比如几分钟到几小时,并配合 s-maxage 交给 CDN 处理。把入口页设成一年长缓存,等于告诉抓取端和中间节点都不必再取新版本,链接更新后蜘蛛可能长时间看不到。

校验头:影响重复抓取走不走全量

ETag 和 Last-Modified 是条件请求的基础。蜘蛛再次访问时带上 If-None-Match 或 If-Modified-Since,服务端如果判定内容没变,返回 304,双方都省下传输。需要注意的是,多台后端各自生成 ETag 时,同一个 URL 在不同节点上可能算出不同值,蜘蛛每次都会认为内容变了,于是 304 永远命中不了。

压缩:影响一次抓取搬多少字节

Accept-Encoding 里声明 gzip 或 br,服务端就要如实返回 Content-Encoding。压缩能明显减少 HTML 的传输量,对体积偏大的入口页尤其有用。但如果压缩层和源站各压一次,或者 Content-Length 与实际字节数对不上,抓取端就可能读到截断的页面,链接自然也就丢了一部分。

常见的配置误区

  • 入口页套用长缓存:一改链接就要等缓存过期,蜘蛛看到的还是旧版本。
  • ETag 不稳定:多机、多版本、带时间戳的 ETag 会让条件请求形同虚设。
  • 重复压缩:源站已压缩,CDN 再压一次,或头部声明与实际编码不符。
  • CDN 缓存了异常状态码:把 5xx 或临时 301 缓存下来,蜘蛛连续几次都撞上同一个错误。
  • 缓存键忽略 Vary:没有声明 Vary: Accept-Encoding,不同编码的响应互相覆盖。

入口页的配置建议

  1. 入口页的新鲜期设短,HTML 建议几分钟到几小时,静态资源可以放长。
  2. ETag 用内容哈希生成,保证同一内容在不同节点上取值一致;做不到就干脆只保留 Last-Modified。
  3. 只做一层压缩,并在响应头里如实声明 Content-Encoding,同时打开 Vary。
  4. CDN 只缓存 2xx,明确跳过 4xx、5xx 和带 Set-Cookie 的响应。
  5. 入口页内容更新后主动刷新缓存,比等待自然过期更可控。

怎么验证是否按预期生效

命令行核对

用 curl 带 -I 和 Accept-Encoding 请求入口页,连续请求两次,看第二次是否返回 304、ETag 是否稳定、Content-Encoding 与 Content-Length 是否自洽。多台服务器都要各测一次。

日志与指标核对

在访问日志里统计入口页的 200 与 304 比例。如果 304 长期为零,说明条件请求没生效,抓取端一直在做全量下载;如果 5xx 的缓存命中偏高,就要检查 CDN 的缓存规则。

缓存与压缩属于基础设施层面的细节,改对了不会立刻带来收录变化,但改错了会持续拖慢抓取。建议把它们当作常规巡检项,而不是一次性的优化动作。

入口页的价值在于让链接被稳定地发现。缓存头、校验头和压缩配置做得干净,蜘蛛每次来访都能用较低的成本拿到正确的内容,后续的 URL 发现才有讨论的意义。这些设置与是否被收录没有直接因果关系,但能让抓取过程少一些无谓的损耗。