跳轉鏈是怎么一步步長出来的
單個 301 很常见,問题出在跳轉叠加。一次訪問要经過好几跳才能到達最终頁面,蜘蛛的每次請求都被消耗在中間环节上。常见的叠加来源包括:
- 协议切換:http 跳 https,同时 www 又跳非 www,两件事發生在不同层;
- 结尾斜杠:内鏈寫的是 /about,服務器却把 /about 跳轉到 /about/;
- 改版與栏目調整:舊目錄 301 到新目錄,新目錄後来又改了名字,舊地址没有同步更新;
- 平台或插件預設設定:建站程序、CDN、安全组件各自加了一层跳轉;
- 大小寫與參數規范化跳轉,和前面的規則再叠一层。
單獨看每一层都合理,串起来就變成三跳、四跳,甚至出現 A 到 B 再回到 A 的循环。跳轉鏈本身不會让頁面消失,但它會让同一個目标頁面對蜘蛛顯得更遠。
對抓取的實际影响
搜尋引擎對永久跳轉的處理是把信号传递到最终地址的,只是這個传递過程並非没有成本。
- 抓取预算被中間地址占用,真正需要更新的頁面被排到後面;
- 頁面發現變慢,尤其是站外新入口指向的仍然是舊地址时;
- 信号分散,外鏈、canonical、Sitemap 各自指向不同版本时更容易出現分歧;
- 排查變复杂,日誌里同一條路径出現多個狀態碼,判断抓取問题更費時間。
判断标准可以简單一点:從任意一個入口到最终頁面,最好不超過一跳。
自查:一條一條跟到底
不要只看首頁,要按 URL 類型抽样。建议至少覆盖這几種:
- 首頁的几種寫法:http、https、带 www、不带 www、带預設首頁文件名的地址;
- 栏目頁與文章頁,各挑几個,分別從 Sitemap、站内連結、站外入口進入;
- 歷史上改過目錄或域名的老地址,随机抽几條;
- 移動端地址或其他版本地址(如果有)。
具体做法上,用命令行工具只取响應头是比較直接的方式:對目标地址發一次請求,看 Location 字段指向哪里,再對新的地址重复一次,直到返回 200。浏览器開發者工具的網絡面板也能看到同样的鏈條。日誌侧則統計 301、302、307、308 的占比與来源路径,找出被反复請求的中間地址。
處理原則:让人一次跳到终点
- 合並跳轉。把 http 到 https、www 到非 www、结尾斜杠規范化收拢成一條規則,一次跳到最终地址。
- 永久迁移用 301。長期用 302 表示迁移时,搜尋引擎可能繼續保留舊地址,迁移完成後應改回 301。
- 回改站内入口。把導航、面包屑、正文内鏈、友情連結里的舊地址換成最终地址,让蜘蛛不必经過跳轉。
- 同步 Sitemap 與 canonical。两者都寫最终地址,避免一個放舊地址、另一個放新地址。
- 避免一律跳首頁。下线的栏目頁跳到首頁是常见做法,但數量一多,會把大量入口指向同一頁,更合适的做法是指向最相關的上級栏目,或返回 410。
- 检查循环。定期抽取舊地址做一次全鏈路跟踪,確認没有多跳回路。
几類容易被忽略的跳轉
除了服務器层的規則,還有几種跳轉藏在別處:
- 脚本跳轉與 meta refresh。蜘蛛需要执行脚本或解析頁面头才能發現目标地址,不如 301 直接明确。
- 移動端與桌面端互跳。規則寫反时两端會互相指向,蜘蛛来回切換。
- 多語言或多地区版本跳轉。按語言自動跳轉的頁面,最好同时提供可点击的切換入口,別让蜘蛛只能依赖跳轉。
- 带參數地址的規范化跳轉。篩選、排序參數被跳轉到干净地址是合理的,但別让干净地址又跳回带參數的版本。
什么时候该再查一遍
跳轉規則會被後来的改動覆盖。下面几個時間点值得重新跑一次自查:換域名或啟用 HTTPS 之後、站点改版或栏目調整之後、更換 CDN 或安全组件之後、批量修改内鏈之後。每次查完把目前的跳轉規則记一筆,下次排查會省不少事。
跳轉自查不需要多复杂的工具,难的是每次都跟到最後一跳。把這條鏈路理顺,蜘蛛到頁面的路径變短,抓取和頁面發現會更接近你的预期。