重定向也是一种 URL 发现方式
很多人把 URL 发现理解成「内链 + Sitemap + 外链」,其实服务器返回的 3xx 响应同样是蜘蛛拿到新地址的途径之一。当蜘蛛请求 A 地址,服务器回一个 301 并带上 Location 头,蜘蛛就会把 B 地址放进待抓队列。换句话说,一次跳转相当于一次额外的 URL 提交。
这个过程是有成本的:蜘蛛花在 A 上的那次请求没有拿到内容,还得再花一次请求去 B。跳转链越长,浪费的抓取预算越多,最终页被首次抓取的时间也越靠后。
几种跳转方式,蜘蛛的处理并不一样
- 301 / 308:表示永久迁移,蜘蛛通常会逐步把索引里的地址换成目标地址,已有内链也会被重新指向。
- 302 / 307:临时跳转,蜘蛛一般会继续保留原地址并反复访问,同时也会抓取目标地址,相当于两个 URL 都需要维护。
- meta refresh:写在 HTML 里的跳转,蜘蛛需要先拿到页面并解析,优先级低于 HTTP 头,延迟通常更长。
- JavaScript 跳转:依赖渲染能力,能不能被跟上不确定性最大。
跳转链:每一步都在拖慢发现速度
比较麻烦的是链式跳转。协议从 http 到 https、域名带 www 到不带 www、旧域名到新域名、旧栏目到新栏目,几条规则叠加起来,一个地址可能要跳三四次才落到最终页。对蜘蛛来说,每多一跳就多一次请求,落地页的抓取时间被推后,抓取频次也可能受到影响。
还有一种情况是循环跳转,A 跳 B、B 跳回 A。蜘蛛一般在尝试若干次后会放弃,把它当作抓取异常处理,对应的 URL 很难被正常收录。
另外,Location 头建议写成绝对地址。相对地址虽然规范允许,但解析依赖当前路径,规则写错就容易跳到意想不到的位置,排查时也更费劲。
跳转放在哪一层,响应速度不一样
301 可以写在 Web 服务器配置里,也可以在应用代码里判断后输出。前者几乎不经过业务逻辑,响应更快;后者要走一遍程序初始化,首字节时间会明显变长。蜘蛛对首字节时间是有耐心上限的,长期偏慢会拉低整个站点的抓取节奏。能放在服务器层的规范化跳转,就别留给应用层。
内链尽量直接指向最终地址
改版之后只做跳转、站内链接却还停在旧地址,是常见的偷懒做法。结果就是每一次用户点击和蜘蛛爬取都要经过一次跳转。更省事的方式是:跳转规则留给外链和历史流量,站内导航、正文、面包屑、Sitemap 里的链接统一替换成最终地址。
同样,Sitemap 里只放最终 URL,不要放会跳转的中间地址。既有 301 又有 Sitemap 提交,等于让蜘蛛用两条路径去同一个地方,多花一份预算。
排查时可以看这几个地方
- 抓取日志里 3xx 的占比。占比长期偏高,说明站内还有大量链接指向跳转地址。
- 跳转链长度。用命令行工具跟随 Location,看一个 URL 到底跳了几次。
- 协议、域名、路径大小写、结尾斜杠这几类规范化跳转是否重复叠加。
- 页面内的 meta refresh 与 JS 跳转,能否用服务端 301 替代。
跳转是补救手段,不是长期结构。能一次性把最终地址给到蜘蛛,就别让它多走一站。