站内出現 301 很常见,換域名、換协议、加 www、調整目錄结构,都會留下跳轉。單看一次跳轉没什么問题,蜘蛛能跟過去。麻烦的是鏈條:当 A 跳到 B、B 又跳到 C,蜘蛛為了拿到一個頁面,要發出三次請求,中間任何一环慢一点、错一点,這條路径就可能断在半路。
一次跳轉,蜘蛛要付哪些成本
把重定向看成“多花一次請求”是不够的,它牵扯到几件事:
- 請求次數:每次跳轉都是一次完整的 HTTP 往返,換了主机名還要重新做一遍 DNS 解析和连接。
- 時間叠加:單跳 200ms 不顯眼,三跳就是 600ms 以上,還不算排队等待。
- 超时窗口:抓取器對整條鏈路通常有時間上限,鏈路越長,越容易在中途被放弃。
- 抓取額度:跳轉請求同样占用站点被分配的抓取预算,最终頁面的抓取机會被稀释。
容易被忽略的多跳组合
多數多跳不是一次配置出来的,而是几次改動叠加的结果,常见的有:
- http://example.com/page 跳到 https://example.com/page,再跳到 https://www.example.com/page,协议和主机名各跳一次。
- 舊域名跳到新域名,新域名又跳到带尾斜杠的規范地址,域名和路径各跳一次。
- 目錄改名後,老目錄跳新目錄,新目錄里的連結又指向另一個別名。
- CDN 或负载均衡层再做一次跳轉,站内配置里看不出,實际路径比预期多一跳。
- 大小寫或參數顺序不一致,被服務器跳轉到“正确”版本。
這些鏈條單看每一环都正常,合起来就是用三四次請求換一個頁面。
301、302 與前端跳轉的差別
301 和 308 表示永久,302 和 307 表示临时,蜘蛛對两者的處理倾向不同:临时的跳轉更可能被反复確認,永久跳轉則更容易被替換成最终地址。更需要留意的是前端跳轉——meta refresh 和脚本里的 location.href,蜘蛛不一定都會执行,即使执行,也要先完成頁面渲染,成本和不确定性都更高。能用服務端狀態碼表達的跳轉,尽量別交给前端。
怎么把鏈條查出来
- 對重点 URL 跑一遍 curl -IL 之類的請求,把每一跳的狀態碼和 Location 打印出来。
- 在抓取日誌里筛 3xx 狀態,統計哪些地址反复出現。
- 检查 Sitemap:放進去的應该是最终地址,而不是需要跳轉的舊地址。
- 抽查站内連結,尤其是導航、面包屑和正文里仍然指向舊路径的那些。
缩短鏈條的處理顺序
- 先让内鏈和 Sitemap 全部指向最终地址,這一步收益最直接。
- 把两次跳轉合並成一次,例如 http 直接跳到 https://www 版本,中間不再经過 https:// 裸域。
- 跳轉的终点要是返回 200 的同主题頁面;跳到首頁或 404,會被判断為無效路径。
- 隔一段時間复查一遍,避免舊跳轉一层层叠加成新的鏈條。
跳轉本身不會让頁面掉出抓取范围,但每一跳都在消耗蜘蛛的時間和額度。把鏈條压到一跳以内,是成本最低的調整之一。