很多站点在改版、換域名或調整 URL 規則之後,會留下一條看不见的路径:舊地址跳到中間地址,中間地址再跳到另一個中轉地址,最後才落到目标頁。訪客在浏览器里几乎感觉不到,但對抓取和日誌分析来说,每一次多余的跳轉都要多花一次請求。
多一次跳轉,多花一份成本
一次 301 本身不是問题,問题在于鏈式跳轉。常见的直接代價有几項:
- 抓取预算被消耗。爬虫跟進一個地址,需要逐個請求中間节点,同一份内容要請求好几次。
- 超时風險變大。鏈越長,任意一环响應慢,整條鏈就可能中断,最终頁面拿不到。
- 權重传递被稀释。主流搜尋引擎能處理多級跳轉,但每多一层就多一层损耗,没有理由主動制造。
- 排查困难。日誌里出現的是中間地址,而不是最终頁面,統計和归属容易错位。
重定向鏈通常是怎么堆起来的
多數鏈不是一次性设計出来的,而是多次改動叠加的结果:
- 先做了 http 到 https 的跳轉,後来又把不带 www 跳到带 www,两條規則各自獨立,就串成了三段鏈條。
- 改版时把 /old-a/ 指向 /new-a/,之後栏目结构調整,又把 /new-a/ 指向 /final-a/,但第一條規則没有跟着改。
- 结尾斜杠、大小寫、首頁 index 等差异各寫了一條規則,彼此串联。
- CDN、反向代理、應用层、CMS 插件各自配了一套跳轉,請求要穿過好几层才到终点。
- 列表頁翻頁或篩選參數把用戶送到某個中轉地址,再由那里跳到規范頁。
怎么查出一條鏈到底有多長
- 用 curl -I -L 跟一次,看返回头里出現了几次 Location,以及每一跳的狀態碼是 301 還是 302。
- 浏览器開發者工具的網絡面板,观察請求列表里同一個地址是否出現多次重定向记錄。
- 站点爬虫工具跑一遍全站,篩選出跳轉层級大于 1 的地址,通常能一次列出所有鏈。
- 翻服務器訪問日誌,找狀態碼為 3xx 且来源在站内的請求,看看哪些舊地址還在被反复訪問。
- 检查 sitemap、内鏈、導航菜單、正文里是否還留着已经跳轉過的舊地址,這些往往是鏈條的起点。
修复时的几個原則
- 一步到位。把舊地址直接指向最终目标,中間的過渡頁能删就删,不要保留所谓的“临时中轉”。
- 規則去重。协议、主机名、结尾斜杠的處理尽量在同一层級完成,避免每层各做一遍。
- 少用临时跳轉。長期存在的 302 容易让搜尋引擎反复確認目标,确定不再變動的地址就用永久跳轉。
- 改完回头驗證。重新跑一遍爬虫和 curl,確認鏈長回到 1,同时检查舊地址没有落到 404。
- 別忘内鏈。頁面里的内鏈如果還指向舊地址,等于每天主動制造新的跳轉請求,顺手一起替換掉。
重定向是给歷史地址收尾的工具,不是日常連結的常規路径。能用正确地址,就別让用戶和爬虫绕路。