在蜘蛛池里,入口页能不能被蜘蛛正常抓取和解析,很多人第一反应是看状态码:200、301、404。状态码当然重要,但蜘蛛拿到的不只是一个数字,还有一组 HTTP 响应头。响应头配得不对,页面即使返回 200,也可能被误判类型、反复重抓,或者因为缓存策略混乱而让蜘蛛白跑。
Content-Type:告诉蜘蛛这是什么
蜘蛛首先根据 Content-Type 判断资源类型。入口页应该返回 text/html,并带上正确的字符集,例如 text/html; charset=utf-8。如果服务器错误地返回 text/plain 或 application/octet-stream,蜘蛛可能不按 HTML 解析,页面里的链接和正文就难以进入后续流程。
字符集也要和页面实际编码一致。声明 utf-8 但文件是 gb2312,容易出现乱码,蜘蛛提取标题、正文时可能拿到错误文本。检查方法很简单:用 curl -I 看响应头,再用浏览器查看页面编码是否一致。
Last-Modified 与 ETag:让蜘蛛知道有没有变
Last-Modified 表示页面最后修改时间,ETag 是资源版本标识。蜘蛛再次来访时,可能带上 If-Modified-Since 或 If-None-Match,如果内容没变,服务器返回 304,蜘蛛就知道不用重新下载正文。这能减少带宽和抓取消耗,也能让抓取配额用在更有变化的地方。
常见问题有两个:一是每次请求都动态生成当前时间,导致 Last-Modified 一直变,蜘蛛会以为页面总在更新;二是时间设成未来,或者和实际内容修改时间差距太大,容易造成判断混乱。比较稳妥的做法是让 Last-Modified 跟随内容真实更新时间,不要在每次请求时刷新。
Cache-Control:影响缓存与重访
Cache-Control 主要给中间缓存和客户端看,但蜘蛛也会参考。对于入口页,常见配置是 max-age=3600 或更短,表示一小时内可以直接用缓存。如果设置 no-store,每次都要回源,抓取频繁时会给服务器增加压力;如果设置过长的 max-age,页面更新后蜘蛛可能延迟发现。
这里的取舍不是绝对的。入口页更新不频繁,可以适当放长;内容变化快,就缩短。关键是不要一边把 max-age 设成一年,一边又指望蜘蛛很快看到改动。
其他容易踩坑的响应头
- Content-Length:长度和实际内容不符,可能让蜘蛛读取中断。动态输出时注意不要用错误的手工设置。
- Vary:如果根据 UA 返回不同内容,要正确设置 Vary,否则缓存可能把蜘蛛版本和用户版本混在一起。
- X-Robots-Tag:它可以在 HTTP 头里控制索引行为,优先级和 meta robots 类似。如果不小心写了 noindex,页面即使有链接也难进入索引。
- 重定向响应头:301、302 的 Location 要完整可访问,跳转链过长会消耗抓取预算。
响应头不是装饰,它决定了蜘蛛拿到页面后的第一步判断。状态码正常,不代表解析路径正常。
实际检查与配置建议
- 用 curl -I 或浏览器开发者工具查看入口页响应头,确认 Content-Type 和字符集。
- 对比页面真实修改时间和 Last-Modified,避免每次请求都变。
- 检查 Cache-Control 是否与更新节奏匹配,不要无脑 no-store,也不要过长。
- 确认没有多余的 X-Robots-Tag: noindex 或错误的 Vary 设置。
- 观察日志里 304 的比例:如果几乎没有 304,可能是缓存头或条件请求没生效。
把这些响应头理顺,蜘蛛池的入口页至少不会在“第一步”上被误判。它不能保证收录或排名,但能减少无谓的抓取浪费,让后续的链接发现和内容解析更顺畅。