站内出现跳转很常见,https 改造、域名切换、目录重构都离不开 3xx。但跳转不是零成本的:蜘蛛每跟一次跳转,都要重新发起请求、重新读响应头,必要时还会重做 DNS 与 TLS。链路一长,抓取效率就悄悄往下掉。
蜘蛛遇到 3xx 时到底做了什么
蜘蛛请求一个 URL 后,如果收到 301 或 302,它会读取 Location 头,把目标地址放进自己的抓取队列,然后按节奏再去请求一次。这个过程不是“瞬间跳过去”,而是一次新的抓取任务。对单条 URL 来说,多一跳就是多一次请求;对整站来说,成千上万个链接都多一跳,消耗就叠加起来了。
一跳的代价,比想象中多
- 多一次 HTTP 请求,抓取预算按请求计算,不是按最终页面计算
- 目标主机不同时,要重新做 DNS 解析;HTTPS 还要重新握手
- 服务器日志里多出一条 3xx 记录,统计时容易被误算成“已抓取”
- 链路中某一跳超时或返回 5xx,蜘蛛可能直接放弃,终点页始终拿不到
常见的几种“越跳越长”
协议与主机名连环跳
http://example.com 跳到 https://example.com,再跳到 https://www.example.com,这是三跳,只有最后一跳才算有效抓取。站点若能一次 301 直接指向最终地址,就省掉中间一段。
尾斜杠与大小写反复跳
/list 与 /List、/list/ 之间互相跳,往往来自服务器配置和代码拼接规则不统一。内链里混着几种写法,蜘蛛就会把这些变体都走一遍。
参数回跳到干净地址
带跟踪参数的地址先跳回不带参数的地址,表面上是统一了 URL,实际是让蜘蛛多抓一次。内链直接写干净地址会更省事。
JS 跳转与 meta refresh
这类跳转蜘蛛不一定跟,或者跟得比 3xx 慢得多。能用服务端 301 讲清楚的事情,尽量不要留给前端脚本。
怎么查自己站上的跳转链
- 在服务器日志里筛 3xx 状态码,看哪些路径出现频率高、Location 指向哪里
- 抽几个核心 URL 手动跟一遍,数一数经过几跳才返回 200
- 检查内链与导航,确认它们指向的是终点 URL,而不是跳转入口
- Sitemap 里写的应该是终点地址,不是需要跳转的旧地址
- 确认链路里没有环,A 跳 B、B 又跳回 A 是最糟的情况
跳转什么时候必须保留
旧地址已经对外发布过、有外链指向,这种跳转要留着,而且尽量用 301 做永久指向,不要中途改来改去。真正该收敛的是“新链接也在走跳转”这种情况——新生成的 URL 本身就应该是一个能直接返回 200 的终点,不需要经过任何中转。
跳转是给旧地址收尾用的,不是给新地址开头用的。
顺手检查的几个细节
把跳转链压短,其实是在替蜘蛛省掉一部分无效往返。除了跳转本身,也可以顺便看一眼服务器:跳转响应如果经常慢于正常页面,或者高峰期有超时,蜘蛛跟到一半退出的概率会变高。抓取路径上的问题往往不是单点,跳转、响应时间、内链写法经常一起出现,一起处理效率更高。
小结
把跳转链控制在一跳以内,是抓取路径上比较容易做、收益也比较稳的调整。它不需要改模板、不需要动内容,只要让内链和 Sitemap 直接指向终点,就能把蜘蛛花在中转上的那部分时间省回来。