很多站点在改版、换域名或调整 URL 规则之后,会留下一条看不见的路径:旧地址跳到中间地址,中间地址再跳到另一个中转地址,最后才落到目标页。访客在浏览器里几乎感觉不到,但对抓取和日志分析来说,每一次多余的跳转都要多花一次请求。
多一次跳转,多花一份成本
一次 301 本身不是问题,问题在于链式跳转。常见的直接代价有几项:
- 抓取预算被消耗。爬虫跟进一个地址,需要逐个请求中间节点,同一份内容要请求好几次。
- 超时风险变大。链越长,任意一环响应慢,整条链就可能中断,最终页面拿不到。
- 权重传递被稀释。主流搜索引擎能处理多级跳转,但每多一层就多一层损耗,没有理由主动制造。
- 排查困难。日志里出现的是中间地址,而不是最终页面,统计和归属容易错位。
重定向链通常是怎么堆起来的
多数链不是一次性设计出来的,而是多次改动叠加的结果:
- 先做了 http 到 https 的跳转,后来又把不带 www 跳到带 www,两条规则各自独立,就串成了三段链条。
- 改版时把 /old-a/ 指向 /new-a/,之后栏目结构调整,又把 /new-a/ 指向 /final-a/,但第一条规则没有跟着改。
- 结尾斜杠、大小写、首页 index 等差异各写了一条规则,彼此串联。
- CDN、反向代理、应用层、CMS 插件各自配了一套跳转,请求要穿过好几层才到终点。
- 列表页翻页或筛选参数把用户送到某个中转地址,再由那里跳到规范页。
怎么查出一条链到底有多长
- 用 curl -I -L 跟一次,看返回头里出现了几次 Location,以及每一跳的状态码是 301 还是 302。
- 浏览器开发者工具的网络面板,观察请求列表里同一个地址是否出现多次重定向记录。
- 站点爬虫工具跑一遍全站,筛选出跳转层级大于 1 的地址,通常能一次列出所有链。
- 翻服务器访问日志,找状态码为 3xx 且来源在站内的请求,看看哪些旧地址还在被反复访问。
- 检查 sitemap、内链、导航菜单、正文里是否还留着已经跳转过的旧地址,这些往往是链条的起点。
修复时的几个原则
- 一步到位。把旧地址直接指向最终目标,中间的过渡页能删就删,不要保留所谓的“临时中转”。
- 规则去重。协议、主机名、结尾斜杠的处理尽量在同一层级完成,避免每层各做一遍。
- 少用临时跳转。长期存在的 302 容易让搜索引擎反复确认目标,确定不再变动的地址就用永久跳转。
- 改完回头验证。重新跑一遍爬虫和 curl,确认链长回到 1,同时检查旧地址没有落到 404。
- 别忘内链。页面里的内链如果还指向旧地址,等于每天主动制造新的跳转请求,顺手一起替换掉。
重定向是给历史地址收尾的工具,不是日常链接的常规路径。能用正确地址,就别让用户和爬虫绕路。