做站点运营时,URL 跳转几乎是绕不开的:换域名、上 HTTPS、统一 www、给列表页补上尾斜杠,都会产生 301 或 302。单次跳转本身不是问题,搜索蜘蛛能正常跟随。真正影响抓取效率的,是一条链上串了太多跳转:从旧地址出发,要经过三四次响应才落到最终返回 200 的页面。
一次跳转和四层跳转,差别在哪
蜘蛛拿到一个 URL 时,期望的是尽快拿到内容。如果第一次响应是 301,它会记下新地址并继续请求;再来一个 301,再来一个。每一次都算一次独立的 HTTP 请求,都要占用连接、时间与抓取配额。链越长,同一个目标页面被看到的时间越晚,抓取预算也被摊得越薄。
更麻烦的是,如果中间某一跳返回的是 302、meta refresh 或 JS 跳转,蜘蛛对它们的处理并不一致:302 常被当作临时状态反复确认,JS 跳转则需要进入渲染流程才有机会被发现。链路上只要有一环卡住,后面的目标页就很难被稳定抓到。
站内跳转链通常是这样堆起来的
- HTTP 到 HTTPS 一跳,再加上 www 与非 www 一跳,合并成两层;
- 旧域名整体迁移时,规则写成旧域名到中间域名、再到新域名;
- CDN 或负载层配了一条跳转,源站又配了一条,两层叠加;
- 页面里的手写链接指向带参数的旧地址,旧地址再跳到规范地址;
- 大小写、尾斜杠、默认页各自触发一次归一化跳转。
蜘蛛跟随跳转时大致会做这几件事
- 请求原 URL,拿到 3xx 状态码与 Location 头;
- 把新地址放进待抓取队列,等待下一轮调度;
- 若新地址又返回 3xx,继续入队,直到拿到 200 或明确的错误码;
- 最终页面被解析后,其中的链接才进入后续的 URL 发现流程。
可以看出,跳转链一般不会让 URL 彻底丢失,但会把它往后排。对于本来就抓取频率不高的站点,一串跳转可能意味着目标页要等上更久,列表页里的新链接也跟着延迟被发现。
排查一条链有多长
最直接的方式是用命令行查看完整链路:curl -IL 地址 会依次打印每一跳的状态码与 Location,注意是否出现循环、是否终止于 200。
接着对照服务器日志,筛选 301 与 302 的访问记录,看哪些地址被反复请求、哪些每次都跳到同一个目标。也可以检查 Sitemap 与内链里写的是不是最终地址:如果站内链接指向的是会跳转的旧地址,那蜘蛛每抓一次就多走一步,日志里的 3xx 数量也会明显偏高。
处理原则:让跳转尽量短
- 能合并的规则合并,让一次跳转直接落到最终地址;
- 站内链接、Sitemap、规范标签一律使用最终 URL,不再指向跳转地址;
- 临时性变更用 302,永久性迁移用 301,不要把 302 长期挂着;
- 避免用 meta refresh 与 JS 做主要跳转,它们对蜘蛛的可见性不如 3xx 直接;
- 迁移期结束后清理旧规则,防止链条越留越长。
变更之后别忘了复检
每次改版、切换 CDN、上线新的跳转规则之后,抓取路径都可能悄悄变长。建议固定几条典型入口 URL,比如首页、一个栏目页、一个详情页,定期用 curl 检查跳转层数,同时观察日志中 3xx 的比例是否上升。3xx 占比异常升高,往往说明某条规则被叠加了,或者站内又开始大面积引用旧地址。
跳转不是错误,层层跳转才是成本。让蜘蛛用最少的请求拿到最终页面,本身就是一种抓取效率上的优化。