站点换域名、调整目录层级、合并栏目之后,重定向几乎是必然会出现的中间产物。大多数运营者关注的是用户还能不能正常打开页面,而蜘蛛这一侧要面对的是另一个成本:每跳一次,就要多花一次请求机会。
蜘蛛拿到 3xx 之后会怎么处理
蜘蛛请求一个地址,如果服务器返回 301 或 302,它会读取响应头里的 Location,然后对这个新地址再发起一次请求。这个新地址同样要走完整的抓取流程:解析域名、建立连接、等待首字节、下载并解析正文。也就是说,一次跳转在蜘蛛那边并不是轻量操作,它是实打实的又一次抓取。
301 与 302 的区别
- 301 表示永久迁移。蜘蛛通常会逐步把索引里的旧地址替换成新地址,内链和外链的价值也倾向于顺着新地址延续。
- 302 表示临时跳转。蜘蛛一般会保留原地址,并继续回来检查这个临时状态是否还在。
- 把长期有效的迁移写成 302,容易出现新旧两个地址长期并存的情况,判断上的模糊就来自这里。
308 与前端跳转
308 与 301 类似,但明确要求保持请求方法,可以理解为更严格版本的永久跳转,在需要保留 POST 等请求方式的场景下更合适。另外还有一类容易被忽略的:meta refresh 和 JavaScript 跳转。它们不在 HTTP 头里,蜘蛛必须先把页面 HTML 下载并解析完,才知道要去哪里,成本比头部跳转更高,而且解析环节一旦出问题,这条路径就断在这里。
一次跳不到位,成本会被放大
A 跳到 B,B 又跳到 C,这种链式重定向在历史积累较久的站点里很常见。对蜘蛛来说,一次跳转是两次请求,两次跳转就是三次请求,而最终落地的内容只有一份。抓取预算是有限的,这些被中间环节吃掉的请求不会产生任何新内容,还会挤占本来可以分给正常页面的份额。
更麻烦的是链条中途出问题。比如 A 通过 301 指向 B,而 B 返回了 404 或者 5xx,蜘蛛走到的就是死路。还有一种情况是跳转回自身,或者 A 到 B、B 又回到 A,形成循环。蜘蛛遇到循环会停止跟随,但已经被消耗掉的抓取次数收不回来。
另外,如果内链和 Sitemap 里仍然写着最初的旧地址,那么蜘蛛每一次从站内走到这个链接,都会重复经历整条跳转链。链接入口越多,这种重复就越明显。
怎样查清站内的重定向情况
- 用 curl -I 或类似的头部检查方式,逐个确认关键地址返回的状态码以及 Location 指向哪里。
- 翻服务器日志,筛出状态码为 3xx 的请求,重点看哪些地址被反复请求、链条有多长。
- 检查 Sitemap 文件,确认里面写的是最终地址,而不是还需要跳转的旧地址。
- 抽几个主要频道页,确认内链与导航指向的是终点,而不是中转地址。
可以做的几项调整
- 把多次跳转压缩成一次,让旧地址直接指向最终页面。
- 长期迁移用 301,临时活动用 302,尽量避免长期混用。
- 内链、导航、Sitemap 统一更新为最终地址,减少蜘蛛从站内进入跳转链的机会。
- 定期清理已经失效的中转地址,避免它指向的终点早已下线却没人发现。
重定向是迁移过程中的过渡手段,不是长期结构。链条越短,蜘蛛越省事,页面被发现和被检查的机会也越稳定。