蜘蛛遇到 3xx 时会做什么
主流搜索引擎蜘蛛在抓取时会对 301、302、307、308 等状态码发起跟随请求,最终拿到状态 200 的页面内容。这个过程对用户是无感的,但从抓取角度看并不免费:每一次跳转都是一次独立的 HTTP 请求,占用该站点的抓取配额,也拉长单次抓取耗时。跳数越多,蜘蛛在同一个入口上花的预算越多,能分给其他页面的次数就越少。
另外,蜘蛛通常只把最终落地页当作有效结果,中间那些跳转 URL 很少被当成独立页面收录。也就是说,一条三跳的重定向链,等于你用三个 URL 的抓取成本,换来一个页面的内容。
多跳链最常见的几种形态
- HTTP 到 HTTPS、再到 www:协议和主机名各改一次,一条链就两三跳。
- 旧域名跳新域名、再跳带尾斜杠版本:改版或换域名时没做一步到位。
- 短链、跟踪链接跳落地页:对外投放会批量产生这类中间 URL。
- 按 UA 判断的移动端跳转:同一 URL 对不同 UA 返回不同的跳转目标。
这些形态单独看都不算错,但叠加起来就容易出现 跳转链过长、跳转目标不一致 的问题。建议在服务器配置层把 HTTP 到 HTTPS、非 www 到 www 的规则合并成一次跳转,直接指向最终 URL。
循环和断链:比多跳更严重
A 跳 B、B 又跳回 A 的循环,会让蜘蛛在同一个闭环里反复请求,最后放弃这条路径。日志上往往表现为同一组 URL 在短时间内被高频访问,状态码全是 3xx,没有 200。另一种情况是跳转终点落在 404、410 或者 noindex 页面,蜘蛛跟到底却拿不到可用内容,这条路径上的 URL 发现就断了。
排查建议:先看抓取日志里 3xx 的占比和出现频率,再抽样几条链用 curl -I -L 或浏览器网络面板确认跳数,重点检查是否存在循环和死路。
相对链接的解析基准是最终 URL
这一点经常被忽略:如果页面 A 通过 301 跳到页面 B,而页面 B 里用的是相对链接,蜘蛛会以 B 的地址作为解析基准,而不是 A。如果两处目录层级不同,相对链接很可能指向意料之外的位置,凭空多出一批无效 URL。做跳转时,尽量让落地页使用完整路径或根相对路径,减少歧义。
301 与 302 的长期差别
301 一般被理解为永久迁移,302、307 被理解为临时。短期活动页、临时维护用 302 没问题;但如果一个 URL 长期用 302 指向另一个 URL,蜘蛛会持续认为原地址仍是正式地址,信号合并和 URL 规范化都会变慢。换域名、改目录这类不可逆的调整,用 301 更合适。
Sitemap 和内链里不要放跳转 URL
Sitemap 是给蜘蛛的 URL 清单,里面出现 301 或 302 的地址,等于让它先去跳一次再回来。正确做法是清单里只写最终可访问、返回 200 的地址。内链同理:导航、面包屑、正文里的链接直接指向最终 URL,能省掉大量无意义的跳转请求。
至于 JS 跳转和 meta refresh,蜘蛛的处理能力弱于服务端 301、302,延迟更高,甚至可能不执行。需要长期生效的跳转,优先放在服务端完成。
跳转链怎么自查
- 随机抽取站内 20 到 30 个入口 URL,记录跳数,把超过一跳的整理出来。
- 检查协议、主机名、尾斜杠这三类规则能否合并成一条。
- 统计日志中 3xx 请求涉及的 URL 数量,看是否集中在少数几条链上。
- 确认所有跳转链的终点都返回 200,并且没有被 robots.txt 或 meta 标签挡住。
把跳转控制在一次以内,终点稳定返回 200,URL 的发现路径就会短很多。这件事不需要复杂工具,在配置层做一次整理,效果通常比反复提交 Sitemap 更直接。