站点跑上几年,改版、換域名、啟用 HTTPS、調整栏目目錄這些操作多少都會遇到。每一次變更,通常都會留下一條重定向規則。單看每一條都没問题,但規則叠在一起,就可能出現 A→B→C→D 這样的跳轉鏈。對用戶来说只是地址栏闪了一下,對蜘蛛来说却是一次次額外的請求。
跳轉鏈是怎么堆出来的
常见来源大致有這几類:
- 換域名时保留了舊域名的跳轉,後来又在舊域名上做了一次目錄结构調整;
- HTTP 到 HTTPS 一次跳轉,www 與非 www 又一次跳轉,两者没有合並成一步;
- 頁面地址改過两三次,每次都寫了新規則,却没有删掉舊規則;
- CMS 插件、CDN、反向代理各配置了一套跳轉,互相不知道對方存在;
- 带斜杠與不带斜杠、带 index 與不带 index 的寫法各自产生一跳。
這些問题單獨看都很小,组合起来就會變成一條長鏈。判断标准很简單:從舊地址到最终地址,如果中間超過一跳,就值得整理。
長跳轉鏈的三点實际影响
抓取预算被額外消耗
蜘蛛每次遇到 3xx,都要再發一次請求才能拿到最终内容。一條鏈上多出两跳,等于同一個頁面要抓三次才落地。站点規模越大,這種浪費越明顯,真正重要的頁面可能因此排在後面。
信号传递被削弱
虽然 301 會传递大部分信号,但每经過一次跳轉,都增加一次被中断的可能,比如中間某一跳恰好返回 302、被 robots.txt 拦住,或者證书不匹配。鏈路越長,出問题的位置就越多。
排查难度上升
当跳轉規則散落在服務器配置、CDN 後台、程序代碼和插件里,出問题时很难一眼看出是哪一层在起作用。跨人交接的时候更是如此,往往是改完一處,另一處還在按老規則跳。
一次完整的自查流程
- 導出最近一段時間服務器日誌里返回 3xx 的路径,按出現次數排序,先處理高频的。
- 用命令行工具逐條跟踪跳轉,记錄完整鏈路,包括每個地址返回的狀態碼和 Location 头。
- 把鏈路長度超過一跳的地址挑出来,标注中間每一跳是谁配置的。
- 確認最终落点是否為返回 200 的正式頁面,而不是另一個 3xx 或者 404。
- 合並規則,让舊地址直接指向最终地址,然後删掉中間規則。
- 在站内連結、Sitemap 和外部引用中,尽量直接使用最终地址,避免從源头就产生跳轉。
配置时值得注意的几点
- 区分永久與临时:内容和地址長期不變的用 301;短期活動、A/B 測試這類用 302。不要因為省事就全部寫成 301。
- 留意狀態碼细节:307、308 會保留請求方法,普通頁面跳轉一般用不到,誤用反而容易出問题。
- 少用前端跳轉:meta refresh 和 JS 跳轉對用戶和蜘蛛都不是理想方案,能放在服務端就放在服務端。
- 跳轉不要指向跳轉:新加的規則要直接落到最终地址,而不是落到另一個還會再跳的地址上。
- 保留一張跳轉表:把舊地址、新地址、生效時間、配置位置记在一份文档里,下次改版前先翻一翻。
整理重定向不是一次性任務。每次改版、每次調整目錄,都應该顺手更新跳轉表,让鏈路尽量只有一跳。
把這件小事固定下来
重定向本身是好事,它让舊地址繼續可用,也让用戶和蜘蛛不必面對一堆 404。問题出在没人清理。把跳轉鏈检查放進改版流程里,每次上线前跑一遍,比事後從日誌里翻找要省力得多。鏈路短了,抓取浪費少了,站点结构也更容易讲清楚。