蜘蛛池里经常出現一種情况:日誌中明明只有几百個入口頁,蜘蛛抓取的 URL 數量却翻了好几倍。多數时候不是蜘蛛判断異常,而是同一條連結被服務器当成了多條不同的 URL。URL 归一化要解决的,就是把指向同一内容的不同寫法收敛成一個标准形式。
為什么一條連結會變成好几條 URL
對蜘蛛来说,URL 首先是字符串比較,而不是判断两個頁面像不像。只要有一個字符不同,它就可能当成新地址重新抓取、重新排队。入口頁數量多、生成方式杂的时候,這種重复會被成倍放大。
最容易出問题的几個位置
大小寫
域名部分大小寫通常不敏感,但路径和參數部分一般敏感。/Page 和 /page 在多數服務器上是两個地址。程序批量生成連結时如果大小寫不统一,入口頁數量可能凭空翻倍。
尾斜杠
/abc 與 /abc/ 是否等價,取决于服務器配置。有的會 301 到其中一個,有的两個都返回 200。後者會让蜘蛛各抓一遍,日誌里就多出一份记錄。
www 與协议
http 與 https、带 www 與不带 www,如果四種组合都能打開且都返回正常狀態,等于一個頁面有四個入口。建议只保留一個组合對外,其余用 301 收敛。
查询參數顺序與跟踪參數
?a=1&b=2 與 ?b=2&a=1 内容相同时,很多程序會生成两種連結。再加上 utm_source、from、ref 之類的跟踪參數,同一個頁面可以被複製出许多 URL。入口頁如果用于站外投放,這類參數尤其要處理干净。
编碼與特殊字符
中文路径、空格、百分号编碼的寫法不统一,同样會产生差异地址。生成环节最好统一编碼規則,而不是依赖浏览器自動轉义。
归一化没做好會带来什么
- 抓取预算被重复 URL 消耗,真正需要更新的頁面反而排不上队。
- 日誌統計失真,抓取量看似上升,實际覆盖的頁面並没有變多。
- 同一内容的多個地址同时存在,彼此分散信号。
- 排查問题时难以判断是發現环节出了状况,還是抓取环节出了状况。
實操上的處理顺序
- 先确定唯一的标准形式:用哪個协议、哪個域名前缀、尾斜杠带不带。
- 在服務器层做 301 收敛,不要依赖頁面里的 JS 跳轉。
- 统一生成連結的模板,避免同一套程序輸出两種寫法。
- 站内連結、Sitemap、入口頁外鏈尽量都使用标准形式。
- 對跟踪參數设白名單,不需要的參數干脆不在入口頁生成。
自查清單
- 同一路径的大小寫變体是否都能打開?
- 尾斜杠不同时返回的是哪種狀態碼?
- http 與 https、www 與非 www 是否只有一種可用?
- 參數顺序不同是否會返回相同内容?
- 随机的跟踪參數會不會被服務端当成獨立頁面记錄?
归一化只解决同一條連結被重复看待的問题,它並不會让頁面更容易被找到,也不能替代内容质量和站点整体结构。把它当作减少無效抓取的清理動作更合适。
最後提醒一点:归一化規則一旦定下来,最好寫進接入文档,让後續新增的入口頁都按同一套規則生成。临时改規則容易造成新舊連結混用,反而制造出更多重复 URL。