很多人检查蜘蛛池入口页时,习惯打开浏览器看页面长什么样,却很少看服务器返回的响应头。实际上蜘蛛在解析 HTML 之前,最先拿到的就是这一串头部字段,它决定了蜘蛛要不要继续读正文、多久之后再来、以及这一页在它眼里算什么类型的东西。
为什么响应头值得单独看一遍
页面正文可以慢慢改,响应头往往由服务器配置、程序框架或者反向代理一次性决定,改起来影响面更大。一个配置失误,可能让整批入口页被当成非 HTML 资源处理。
更现实的问题是:响应头的问题在浏览器里通常看不出来。浏览器容错能力强,蜘蛛不一定。
几个真正会被当真的字段
Content-Type 与字符集
正常的网页应该返回 text/html; charset=utf-8。如果写成 text/plain 或 application/octet-stream,蜘蛛可能直接判定这不是网页。charset 与页面内 meta 声明不一致时容易出乱码,正文里的链接也可能识别不出来。
Last-Modified 与 ETag
这两个字段是蜘蛛判断页面有没有变化的主要依据。入口页如果每次请求都返回当前时间戳,蜘蛛会认为内容一直在变,来得更勤,但抓到的其实是同一份东西;反过来,内容确实更新了而 Last-Modified 始终不动,蜘蛛可能长时间不再回访。
Cache-Control 与 Expires
设置合理的缓存时间可以减轻重复抓取带来的压力,但 max-age 设得过长,再叠加 CDN 缓存,蜘蛛拿到的可能是过期副本。
X-Robots-Tag
这个字段相当于 HTTP 版的 meta robots。noindex、nofollow、none 写在响应头里,效果和写在页面里一样。如果一批入口页共用模板,要确认有没有人在服务器层面批量加过限制。
3xx 与 Location
入口页做了跳转时,要确认跳转目标、跳转类型(301、302、307、308)以及跳转层数。链条太长,蜘蛛容易中途放弃。
日常检查做法
- 用 curl -I 或带 -i 参数看原始响应头,而不是只看开发者工具里被简化过的版本。
- 随机抽几台服务器、几个域名,不要只盯着主站看。
- 把响应头与页面正文的声明对一遍,重点看 charset、canonical 和 robots。
- 记录修改前后蜘蛛访问的变化,一次只改一项,便于判断因果。
几条实用建议
- Content-Type 固定为 text/html; charset=utf-8,除非确实是其他资源类型。
- 入口页内容没变,就别让 Last-Modified 乱跳。
- 谨慎使用 X-Robots-Tag,尤其是批量下发的规则。
- 跳转尽量只保留一层 301,并指向最终可访问的地址。
- 改完观察一段时间再下结论,蜘蛛的反应本身有延迟。
响应头不决定蜘蛛会不会来,但它会影响蜘蛛来的时候怎么理解这一页。把这一层理顺,往往比反复调整正文更省事。