为什么重定向链值得单独看
重定向本身没有问题,问题出在“链”。蜘蛛顺着链接爬过来,遇到 301 会继续跟到终点,把终点当作这个 URL 的落点。但每多一跳,就多一次请求、多一次等待,也多一个可能出错的环节。一条三跳的链路,只要中间任何一环超时或返回异常,这个 URL 在这一轮抓取里基本就白跑了。
一跳重定向:正常且推荐
最常见的场景是 http 跳 https、裸域跳 www、旧 URL 换新地址。这类一跳的 301 是标准做法,蜘蛛处理起来没有负担:跟过去,把新地址入库,旧地址慢慢退出。真正需要留意的是,站内链接和 Sitemap 里应该直接写终点地址,而不是继续写那个要跳转的旧地址。否则蜘蛛每轮都要多走一步,抓取容量就这么一点点被消耗掉。
多跳链条是怎么长出来的
链条很少是一次设计出来的,多半是几次改版叠加的结果。比如最早是 http 版本,后来上了 HTTPS,再后来统一到 www,最后又调整了域名或目录结构。没人回头清理,于是一条 URL 要经过三四个 301 才能到终点。
还有一种情况是链条里混进了 302。302 表达的是“临时”,蜘蛛通常不会用它替换掉原来的 URL,也就是说旧地址会继续留在队列里,下一轮再来一遍。如果这个“临时”已经存在了两年,那它对蜘蛛和用户来说其实都已经是永久的了。
几种容易出问题的链路
- 循环跳转:A 跳 B,B 跳 A,或者更长的环。蜘蛛跟几次之后会放弃,这个 URL 基本不会被收录。
- 跳到 404:旧地址还在被外链引用,301 指过去却是个死页面,等于把蜘蛛送进了死胡同。
- 跳转终点带 noindex:蜘蛛跟到了页面,却被告知不要索引,这一趟同样白走。
- 跳到一个还会再跳的地址:常见于 CDN、负载均衡、多地区自动跳转。用户看到的是一瞬间,蜘蛛看到的是一串请求。
- 用脚本或 meta refresh 做的跳转:首轮 HTML 抓取时不一定被识别,容易和渲染阶段产生不一致。
跳转与抓取容量的关系
抓取容量是有限的,蜘蛛每次来访能处理的 URL 数量大致固定。站内如果有大量地址要走两三跳才到终点,等于同样的内容多占了几倍的抓取次数。数量不多时感受不到,一旦是几十万级的旧 URL 堆积,影响就会体现在新页面的发现速度上。
检查重定向链的几个动作
- 挑一批重要 URL(首页、栏目页、Sitemap 里的地址),用命令行工具或抓取工具看完整过程,记录跳数和每跳的状态码。
- 把跳转超过两跳的整理成清单,能合并的就合并成一次直达。
- 确认每个 301 的终点返回 200,并且这个终点本身短期内不会再改。
- 回头查一遍 Sitemap 和内链,看有没有直接指向跳转 URL 的。
- 翻服务器日志,找那些反复出现、状态码是 301 或 302 的请求,它们往往就是链条的源头。
处理原则
站内链接与 Sitemap 只写终点地址;301 用一次就够,不要串成链;临时跳转不要拿来当长期方案;跳转的终点必须是可索引的 200 页面。
重定向链不复杂,只是容易被忽略。定期把站内重要 URL 的跳转路径过一遍,通常比事后从日志里捞异常要省事得多。