蜘蛛发现一个链接后,并不会只看一眼就结束。它会先请求这个 URL,如果服务器返回 3xx,它还会继续跟到 Location 指向的新地址。这个过程就是重定向在 URL 发现里的作用:链接指向 A,A 跳到 B,B 再跳到 C,蜘蛛最终才拿到页面内容。问题在于,每一次跳转都要占用一次请求和一点时间,跳数多了,蜘蛛跟进的速度和意愿都会受影响。
蜘蛛是怎么处理重定向的
常见的重定向状态码有 301、302、307、308。301 和 308 通常表示永久搬移,302 和 307 表示临时搬移。对蜘蛛来说,这两种信号含义不同:如果是永久搬移,它更可能把权重和索引慢慢转移到新地址;如果是临时搬移,它会更倾向于保留原地址。但无论哪种,蜘蛛都需要先跟过去,才能确认最终页面是否值得继续抓取。
如果重定向链只有一跳,比如 HTTP 跳到 HTTPS,或者不带 www 跳到带 www,蜘蛛的消耗很小。但如果是多跳串联,比如先跳 HTTPS,再跳 www,再跳结尾斜杠,再跳大小写,最后才到目标页,那这段链路就会拖慢 URL 发现。
跳数多了会带来什么影响
- 抓取资源被中间地址消耗:每一次跳转都是一次 HTTP 请求,蜘蛛在到达最终页面前已经花掉了时间。
- URL 进入队列的顺序被推后:最终页面的抓取优先级可能下降,新内容被发现得更慢。
- 链路一长,出错概率变高:中间任何一跳返回 404、503 或循环,蜘蛛都可能放弃。
- URL 规范容易混乱:日志里同时出现 A、B、C 多个地址,你很难判断到底哪一个才是蜘蛛最终认可的目标。
对蜘蛛池或站群入口来说,这个问题更明显。入口页本来承担的是把蜘蛛引向目标页的任务,如果入口链接还要经过好几跳才到目标,发现效率就会打折扣。
常见的重定向链场景
很多站点的重定向不是故意设计成链的,而是配置一层层叠加出来的。比较典型的有:
- HTTP 先跳 HTTPS,HTTPS 再跳带 www,带 www 再跳到去斜杠版本。
- 旧域名跳新域名,新域名又跳主站,主站再跳栏目页。
- 移动端判断跳转:桌面 URL 先跳移动 URL,移动 URL 又因为参数问题跳回桌面 URL。
- CDN 边缘节点回源时再做一次跳转,用户和蜘蛛看到的跳转次数不一致。
这些链路平时不一定会出问题,但在蜘蛛集中抓取或服务器负载较高时,多一跳就多一次超时风险。
怎么检查和收敛重定向
如果你不确定站内是否存在长跳转链,可以按下面的顺序排查:
- 看抓取日志:筛出返回 3xx 的 URL,观察 Location 指向哪里,是否连续出现多次 3xx。
- 用命令行检查:curl -I 或 curl -IL 可以逐跳查看响应头和最终地址,注意记录跳数。
- 更新内链:把站内链接直接写成最终 URL,不要依赖重定向去纠正。
- Sitemap 只放最终 URL:Sitemap 里如果放了跳转地址,蜘蛛还要多走一步,不如直接提交终点。
- 服务器和 CDN 配置收敛:把 HTTP 到 HTTPS、域名统一、结尾斜杠规则合并成一次跳转。
一个实用的原则是:从任意入口到最终页面,重定向最好不超过两跳。超过两跳的链路,值得优先处理。
几个容易忽略的细节
- 避免循环重定向:A 跳 B,B 跳 A,蜘蛛会很快放弃,而且会浪费抓取资源。
- 302 不要长期使用:临时跳转放久了,蜘蛛和用户都容易困惑,该用 301 就用 301。
- 参数跳转要谨慎:用参数判断设备或语言时,确保不会把同一个 URL 反复跳来跳去。
- HSTS 和 CDN 缓存:开启 HSTS 后,HTTP 跳 HTTPS 的行为可能被浏览器记住,但蜘蛛端仍以实际响应为准,别假设它一定不请求 HTTP。
- 跳转目标要稳定:最终 URL 如果也经常变动,蜘蛛每次来都要重新走一遍链路,URL 发现会更慢。
把最终地址直接交出去
重定向本身不是坏事,它是站点迁移和规范化时的必要工具。但重定向链越长,蜘蛛发现最终 URL 的成本就越高。更稳妥的做法是:内链、Sitemap、主动推送和入口页都尽量使用最终 URL,把重定向留给确实需要兼容的旧地址。这样蜘蛛每次来访都能少走几步,URL 发现也会更顺。