为什么响应头容易被忽略
大多数人排查抓取问题,第一反应是打开页面源码,检查链接、canonical、meta robots。但蜘蛛在拿到 HTML 之前,先收到的是服务器返回的响应头。这部分信息不显示在页面上,也不会被普通用户看到,却直接决定了蜘蛛接下来怎么处理这个 URL:是解析成网页,还是当成文件下载;是允许索引,还是直接跳过;是立刻重试,还是等一段时间再来。
下面这些头字段,日常配置里出问题的概率不低,值得单独拿出来看一眼。
X-Robots-Tag:写在头里的抓取指令
meta robots 需要蜘蛛解析到 HTML 才能生效,X-Robots-Tag 则在响应头阶段就已经说明态度。它对以下场景特别有用:
- 非 HTML 文件,比如 PDF、图片、压缩包,页面里没地方写 meta;
- 整站或某个目录统一设置规则,不用逐页改模板;
- CDN 或反向代理层面加规则,不需要动源站代码。
常见写法是 noindex,也可以带 UA 限定,只对特定蜘蛛生效。需要注意的是,如果同一个 URL 上同时存在 meta robots 和 X-Robots-Tag,两者会叠加,只要有一个写了 noindex,通常就会按 noindex 处理。改配置时别只删了一处。
Content-Type 与字符集:决定蜘蛛怎么读这份内容
声明成 text/html 的响应,蜘蛛会当网页解析;如果写成 application/octet-stream 或 text/plain,就可能被当成文件或纯文本,链接和结构都不会被正常提取。字符集声明错误则容易出现乱码,标题、正文、链接文字都可能变样。HTML 里的 meta charset 和响应头里的 charset 要一致,源站、CDN、后端模板三处都检查一遍,尤其是做了压缩或转码的链路。
Retry-After:告诉蜘蛛什么时候再来
返回 429 或 503 时,可以带上 Retry-After,给一个秒数或具体时间。这比让蜘蛛自己猜要友好得多。如果服务器正在维护或临时限流,写一个合理的等待时间,比反复返回 5xx 更有利于后续回访节奏。时间别写得太短,也别写得太长,几分钟到几小时比较常见。
Location 与跳转:蜘蛛看到的是第一步
3xx 响应里的 Location 决定蜘蛛下一步去哪。多级跳转、跳转到无关页面、跳转链里夹着 noindex,都会让抓取路径变长甚至断掉。改版时如果旧地址要批量跳转,尽量让每一步都指向最终地址,而不是 A 跳 B、B 跳 C。另外,跳转目标如果是 404 或 5xx,蜘蛛会把这个结果记在跳转链上。
缓存相关头:影响回访时的判断
Cache-Control、ETag、Last-Modified 这几个字段配合起来,决定了蜘蛛再次请求同一 URL 时是否拿到 304。304 本身是好事,说明内容没变,可以节省传输;但如果缓存策略把动态内容缓存太久,蜘蛛可能一直看到旧版本,新发布的内容迟迟不进入抓取视野。动态页面和列表页要特别注意 CDN 的缓存规则。
Vary:同一个 URL 的多个版本
Vary: User-Agent 常见于移动适配或按设备返回不同内容的站点。对蜘蛛来说,这意味着同一个地址可能返回两份不同的 HTML。如果移动版和桌面版的链接、内容差异较大,而站点又没有清晰的自适应或独立移动域名策略,蜘蛛在不同 UA 下看到的页面可能不一致,抓取和归并都会变得复杂。能做成响应式就尽量做成响应式。
排查时的几个动作
- 用 curl -I 或浏览器开发者工具的网络面板,看响应头原文,不要只看状态码。
- 对比蜘蛛 UA 和普通浏览器 UA 请求同一 URL 的差异,特别是 Vary 或按 UA 返回内容的站点。
- 检查 CDN 是否改写、覆盖了源站的响应头,尤其是 X-Robots-Tag 和 Cache-Control。
- 抽查 PDF、JS、CSS 等非 HTML 资源的 Content-Type,避免本应被解析的资源被当成下载文件。
- 改完配置后,用日志观察蜘蛛对同一 URL 的后续请求,确认状态码和行为符合预期。
小结
响应头是蜘蛛进入页面之前的第一段信息,它决定了内容以什么形式被读取、是否被允许索引、什么时候可以再来。把状态码、Content-Type、X-Robots-Tag、Retry-After 这几项检查清楚,很多抓取异常可以在源头找到原因,而不是等到日志里出现大批失败请求才回头排查。
提示:响应头的修改通常涉及源站、反向代理和 CDN 多层,改动后建议同时核对三层返回的结果,避免只在某一层生效。