蜘蛛拿到一個 URL 後先發請求。如果响應是 301 或 302,它不會就此停下,而是讀取 Location 头,繼續請求下一個地址,直到拿到真正的頁面,或者走到它愿意放弃為止。這條"跟着走"的路径就是重定向鏈。鏈條短,抓取顺畅;鏈條長,抓取预算被消耗在中間站,頁面被抓取的节奏也會被拖慢。這里不讨论能不能收錄,只讨论怎么让蜘蛛少走冤枉路。
重定向鏈是怎么走出来的
大多數跨多跳的鏈子不是一次设計出来的,而是几次配置叠加的结果。典型顺序是:蜘蛛請求 http 版本,301 到 https;再 301 到带 www 的域名;再 301 到带尾斜杠的規范形式;最後才是頁面。每一跳听起来都合理,合起来就是四跳。
常见的拼接来源:
- 协议升級:http 到 https,通常是最先加的一层。
- 域名收敛:裸域到 www,或者反過来。
- 路径規范:去尾斜杠、大小寫统一、补預設文件名。
- 站点改版:舊栏目 301 到新栏目,舊栏目後来又被新規則再轉一次。
- 中間层跳轉:CDN、负载均衡、地域或語言判断,在到達源站前先做一次 302。
單看每一层都没問题,問题在于它們會相乘。
几跳算多
没有一個官方阈值,可以按下面的经驗给自己定規矩:
- 1 跳到落地:正常。
- 2 跳到落地:可接受,但要记下来,能合並就合並。
- 3 跳及以上:当作待修項,尤其是栏目頁和詳情頁這類關键地址。
鏈子越長,中間任何一跳出現超时、5xx 或配置遗漏,整條路就断了。很多蜘蛛對跳轉次數本身也有上限,超過上限就不再往下走,你看到的"抓了但没進索引",有时只是它没走到最後。
狀態碼別用错
- 301:永久跳轉,适合已经确定的新舊對應關系。
- 302 / 307:临时跳轉,适合灰度、临时维護頁。
- 308:永久且保持請求方法,接口類地址用得多。
- meta refresh 與 JS 跳轉:蜘蛛要渲染才能识別,属于較弱的信号,能用服務端 301 就別用它們。
临时跳轉長期挂着很常见:怕改错,所以一直用 302。如果新舊地址的關系已经定了,早点換成 301,让蜘蛛和用戶拿到一致的信号。
怎么查出多余的跳轉
從命令行和日誌两头查最省事:
- 用 curl -I 逐個訪問重要 URL,看返回碼和 Location;再用 curl -IL 跟着走一遍,數清楚跳了几次、每跳耗时多少。
- 在訪問日誌里筛 301/302 的請求,重点看两類:跳轉目标又返回 3xx 的,以及被大量内外鏈指向的跳轉地址。
- 检查 Sitemap 里提交的是不是最终地址。提交中間地址,等于让蜘蛛從半路開始走。
- 检查站内鏈。菜單、面包屑、正文連結如果指向 301 的舊地址,蜘蛛每次都會多走一跳。
收敛的顺序
按影响面從大到小改:先把入口全部替換成最终地址,包括内鏈、Sitemap 以及能谈判的外鏈;再合並协议、域名、斜杠這几层,尽量压到一跳。改完用命令行复测一遍,並在日誌里观察一段時間,看 3xx 請求量是否下降、落地頁的抓取是否變密。
重定向鏈本身不是错誤,它只是有成本。把成本控制在能解释的范围内,抓取路径就清爽了。