重定向本身不是错誤,站点迁移、协议升級、域名归一都依赖它。但当一次入口訪問要经過三跳、四跳才拿到最终頁面,或者跳轉鏈條中間出現环路时,蜘蛛抓取的效率和确定性都會下降。這篇文章梳理重定向鏈與跳轉环的常见成因、排查顺序和處理原則。
重定向鏈為什么會消耗抓取
蜘蛛訪問一個 URL 时,會把响應狀態、跳轉目标和最终内容都记錄下来。鏈條越長,單次抓取需要發起的請求越多,抓取预算被中間跳轉吃掉,真正到達内容頁的机會随之變少。更麻烦的是跳轉环:A 跳到 B,B 又跳回 A,蜘蛛拿到的是循环,最终頁面始终不可達。
從日誌上通常能看到两類特征:同一入口在短時間内反复出現 301/302 记錄,且始终没有對應的 200;或者某個 URL 的抓取频次很高,但落地頁的抓取量並没有同步增加。
常见的鏈條成因
- 协议與域名叠加跳轉:http 先跳到 https,再跳到带 www 的 https,两條規則各寫一次,就形成两跳。
- 多层中間件重复加規則:CDN、WAF、反向代理、應用框架各配一條跳轉,叠加後鏈路被拉長。
- 迁移遗留:舊域名跳到新域名,新域名又跳到新版路径,歷史規則没有清理。
- 结尾斜杠與大小寫:不带斜杠的目錄先被补斜杠,再被改寫大小寫,凭空多出一次跳轉。
- 地区或語言跳轉:按 IP 或 Accept-Language 二次分流,蜘蛛拿到的目标可能不稳定。
- 跳轉环:两套規則互相指向,例如一條把 /old 指向 /new,另一條又把 /new 指回 /old。
排查顺序
- 先用 curl 加 -I 或 -L 逐條打印跳轉鏈,確認每一跳的狀態碼和 Location。
- 把 Location 展開成绝對地址逐一比對,重点看协议、主机名、路径是否在同一跳里被同时改寫。
- 對出現频次最高的入口做抽样,統計從入口到最终 200 的跳轉次數,超過两跳的優先收敛。
- 检查配置来源,把 CDN、代理、應用层的跳轉規則列成一張表,找出重复和互相覆盖的條目。
- 核對跳轉环,遇到 A 到 B、B 又回 A 的情况先停用其中一條規則,再驗證鏈路是否恢复單向。
- 收敛完成後重新取一份日誌,對比入口 URL 與落地 URL 的抓取量變化。
處理原則
一跳到位的規則最省事:协议、主机名、路径的規范化尽量合並成一條,避免拆成多級串联。長期不用的舊規則要及时下线,尤其是歷史迁移留下的映射表。
如果确實需要多級跳轉,至少保證中間环节不返回 200 空頁,也不要让跳轉目标依赖訪問者特征。對蜘蛛而言,稳定的目标比聪明的分流更重要。
判断标准可以简化成一句话:從任意入口到最终内容頁,跳轉次數是否稳定且不超過两跳。
與站点其他环节的配合
處理完跳轉鏈後,顺手核對 Sitemap 和站内連結是否已经指向最终地址,而不是仍然指向被跳轉的舊入口。内鏈如果大量指向中間跳轉地址,等于每次点击都要多走一跳,鏈條收敛的效果會被抵消。
另外,跳轉規則的調整属于服務器层改動,改完记得在抓取日誌里至少观察一個完整周期,確認没有新的循环或 5xx 出現,再判断這次收敛是否達到预期。