排查抓取问题的时候,注意力通常放在正文、meta 标签和内链结构上,HTTP 响应头这一层基本被跳过。但蜘蛛在决定一个 URL 要不要抓、抓回来怎么处理、下次还来不来的时候,最先读到的恰恰是响应头。字段配置不对,正文写得再细也可能白费。
Last-Modified 与 ETag:帮蜘蛛少抓一次
这两个字段不决定收录,但会影响蜘蛛重复访问时的判断成本。
- Last-Modified:如果每次请求都返回当前时间,蜘蛛会认为页面一直在变,于是更频繁地回来,抓取预算被消耗在没有实质更新的页面上。合理做法是返回内容真正变更的时间。
- ETag:内容未变时应保持稳定,配合 If-None-Match 请求,服务器可以返回 304,避免重复下载完整正文。反过来,把 ETag 生成成随机的、每次请求都不同的字符串,等于持续告诉蜘蛛“内容又变了”。
- 两个字段互相矛盾时(Last-Modified 没变、ETag 却变了)容易造成判断混乱,建议保持同步更新。
Content-Type:返回类型不对,抓取会被中断
蜘蛛需要靠 Content-Type 判断这个响应该按 HTML 解析,还是当成文件下载。常见问题有三类:
- 页面返回 text/plain 或 application/octet-stream,蜘蛛可能直接放弃解析,内容等于没被抓到。
- 字符集声明缺失,或与正文实际编码不一致,抓到的文本可能是乱码,影响后续判断。
- 类型声明为 text/html,但正文为空或只有一小段占位内容,容易被当作软 404 处理。
排查方式很直接:用 curl -I 或者浏览器开发者工具的网络面板,看响应头和正文类型是否对得上。
X-Robots-Tag:写在 HTTP 里的 robots 指令
这个字段的作用和页面里的 meta robots 类似,但写在响应头里,对蜘蛛更早可见,也能作用到 PDF、图片这类没法插入 meta 的文件。
如果某个目录批量配置了 X-Robots-Tag: noindex,页面本身看不出任何异常,但抓取与展现都会受影响。遇到“页面正常却不被收录”的情况,这一项值得优先检查。
同时要留意别在不需要的地方沿用 nofollow、noarchive 等指令,尤其是从旧站点或模板里复制过来的配置。
重定向与 Retry-After:影响下一次来访
301、302 的 Location 头如果指向已经不存在的地址,或者形成多级跳转,URL 发现的损耗会一层层累积。服务端临时不可用时,返回 503 并带上 Retry-After,比直接给 500 更友好:蜘蛛知道大概等多久再来,而不是把这次失败当成页面真的下线。
缓存相关头部(Cache-Control、Vary、Age)不直接决定抓取,但如果 CDN 把一份错误响应缓存住,蜘蛛和用户都会持续拿到同一份坏结果,排查时非常容易走偏。
一份快速自查清单
- 用 curl -I 检查核心页面,确认状态码、Content-Type 和字符集。
- 隔一段时间请求两次,对比 Last-Modified 与 ETag,确认内容未变时这两个值不会随便变动。
- 全量检索服务器与 CDN 配置,找出所有 X-Robots-Tag,逐条确认是否仍然需要。
- 检查 5xx 场景是否返回了合理的 Retry-After,而不是长期挂着一份错误页。
- 确认 CDN 缓存策略与源站响应头一致,避免错误响应被长时间缓存。
响应头不需要天天盯,但每次改版、迁移、调整缓存策略之后过一遍,能省掉不少“页面看起来没问题、蜘蛛就是不来”的排查时间。