很多站点在改版、換域名、調整栏目之後,會陆陆續續留下一些重定向。單條拎出来看都没問题,串起来却可能變成 A→B→C→D 的長鏈,甚至出現 A→B→A 的循环。蜘蛛顺着連結走的时候,每一跳都要重新發起一次請求,抓取预算和時間就消耗在這些中間环节上了。
重定向鏈為什么值得专门查一遍
站点的抓取预算是有限的,蜘蛛愿意在你這儿多抓几頁,取决于它每次来能不能高效拿到内容。一條跳轉鏈意味着两到三次額外請求,量少时看不出差別,量大时就是實打實的浪費。除此之外還有两個连带影响:一是跳轉過程中連結信号的传递會被削弱,二是用戶端也會變慢,移動網絡下尤其明顯。
常见的几種問题形態
- 多层跳轉:HTTP 跳到 HTTPS,再跳到带 www,再跳到末尾补斜杠,一次訪問跳三四次。
- 循环重定向:規則互相冲突,A 跳到 B,B 又跳回 A,蜘蛛试几次之後放弃。
- 临时與永久混用:该用 301 的地方寫了 302,蜘蛛不确定最终该保留哪個地址。
- 跳轉目标已失效:目标地址本身是 404,或者已经被下线,等于白跳一场。
- 入口連結没更新:站内導航、正文連結、Sitemap 里仍寫着舊地址,蜘蛛每進一次都要先吃一跳。
自查的四個步骤
- 抽取样本:從抓取日誌、Sitemap、外鏈資料里挑出訪問量最高的一批舊地址,几十到几百條就够用,不必全站掃一遍。
- 逐條跟跳轉:用浏览器開發者工具的 Network 面板,或者命令行工具,看完整的跳轉序列和每一跳的狀態碼。重点數层數,超過一跳就要标记。
- 区分類型:長期有效的地址變更用 301,临时活動頁、A/B 測試才用 302 或 307。別把一條長期規則寫成临时跳轉,否則蜘蛛會犹豫要不要更新索引里的地址。
- 從源头改起:站内連結、導航、Sitemap 尽量直接寫最终地址,不要让蜘蛛每次進来都先被跳一次。中間层能删就删。
批量检查的小办法
把 URL 列表交给脚本,逐條輸出狀態碼和跳轉目标,例如用 curl 的 -o /dev/null -s -w '%{http_code} %{redirect_url}' -L 把每一跳记錄下来,最後筛出跳轉次數大于 1 的條目優先處理。這样做的好處是有據可查,不會靠印象判断哪個地址有問题。
服務器與 CDN 层別漏掉
重定向不一定寫在 Nginx 配置或 .htaccess 里,也可能来自 CDN 的邊缘規則、负载均衡、甚至應用框架的路由层。排查时按請求實际经過的顺序走一遍,否則改完配置文件發現還在跳,容易白忙一场。
處理时的几條原則
- 一跳到位:能一步跳到最终地址,就不要保留中間环节。
- 保留有價值的歷史映射:老地址如果有外鏈和收錄,301 到内容最相關的新頁面,而不是全站统一甩到首頁。
- 定期复核:跳轉規則會随着栏目調整逐渐失效,建议每季度重跑一次样本检查。
重定向本身不是問题,没人管的重定向才是。規則寫得越干净,蜘蛛把時間花在内容上的比例就越高。
顺手能做的两件事
一是把检查结果整理成表格,记錄原地址、跳轉层數、最终狀態碼和检查日期,下次對比时一眼就能看出變化;二是在上线流程里加一條硬性要求:任何地址變更,必须同步更新站内連結和 Sitemap,避免新舊地址長期並存。這两件事花不了多少時間,但能省下後面反复排查的功夫。