重定向不是终点,而是路径的一部分
搜尋蜘蛛沿着連結一层层往下走,遇到 301 或 302 时通常不會停下,而是繼續跟到 Location 指向的地址。這就意味着,一次重定向會把原本一次請求就能拿到的頁面,拆成两次甚至更多次請求。跳數越多,抓取路径越長,蜘蛛在這條 URL 上花的時間也越多。
一跳、两跳與多跳的成本差別
單次 301 是很常见的做法,站点迁移、http 換到 https、裸域換到 www 几乎都要用到。問题一般出在鏈上:A 跳到 B,B 又跳到 C,C 才是真正的頁面。每多一跳,就多一次连接建立和响應等待。對服務器来说這不算大事,但蜘蛛的抓取額度有限,同一批 URL 里如果存在大量多跳鏈,能分给真正内容頁的抓取机會就少了。
此外,多跳鏈在传递權重信号时會被稀释,部分抓取系統對超過一定跳數的鏈會降低跟進意愿,甚至直接放弃這條路径。
301 與 302 在抓取中的区別
301 表示永久迁移,蜘蛛通常會把新地址当作正式地址,並逐步用新地址替換索引中的舊地址。302 表示临时跳轉,蜘蛛一般會保留舊地址並持續回来复查,于是舊地址會長期占用抓取名額。如果本来是永久換址却用了 302,舊 URL 會一直留在抓取队列里,新地址的確認也會被拖慢。
長鏈通常来自哪里
- 协议與域名同时切換:先跳到 https 版本,再跳到带 www 的地址,最後還补一次结尾斜杠。
- 目錄层級改版:舊栏目路径没有直接指向新地址,而是先跳到中間過渡頁。
- CDN 或负载均衡回源时附加的跳轉,日誌里不顯眼,但蜘蛛确實多走了一次。
- URL 大小寫、结尾斜杠、index.html 等寫法不统一,靠跳轉来兜底。
- 短鏈、活動頁、舊域名保留的入口,常年挂着多重跳轉。
怎样自查重定向鏈
最简單的办法是看响應头,用命令行加 -L 參數把每一跳的狀態碼和 Location 都打印出来,重点看三件事:最终到達的地址是不是規范地址;中間有没有本该是 301 却用了 302、307 的跳轉;整條鏈一共跳了几次。
另一個角度是服務器日誌。同一来源的蜘蛛在很短時間内连續請求多個相似路径,往往就是它在跟着跳轉鏈走。如果某條鏈的中間地址訪問量很高,终点頁訪問量却一般,說明這條鏈本身就在消耗抓取。
让 URL 發現少走弯路
- 内鏈直接指向终点地址。導航、面包屑、正文里的連結都不要指向會跳轉的地址,能省一次請求就省一次。
- Sitemap 里只放最终地址。把 301 之前的 URL 寫進 Sitemap,等于让蜘蛛每次都先撞一次跳轉。
- 把多跳合並成一跳。能在一個跳轉里從舊地址直達新地址,就不要分两步完成。
- 协议、域名、结尾斜杠统一成一種寫法,全站内鏈按這個寫法生成。
- 定期清理歷史遗留的跳轉規則,尤其是几次改版叠加出来的長鏈。
跳轉與服務器稳定性
多跳鏈不只影响蜘蛛,也會放大服務器压力:每個中間跳轉都是一次真實請求。如果跳轉規則寫得复杂,還要查資料库或做正則匹配,响應時間就會上去。响應慢到一定程度,蜘蛛會降低抓取频率,连正常頁面的抓取节奏都會受影响。所以整理重定向鏈,本质上也是整理站点性能和抓取效率。
不必追求零跳轉,迁移和协议统一本来就离不開 301。關键是让鏈控制在一跳之内,並让内鏈與 Sitemap 尽量指向终点。
這样蜘蛛的每一次訪問都更接近有效内容,URL 被發現、被處理的节奏也會更稳定。