在蜘蛛池里,入口頁數量動辄成百上千,很多运营者會把注意力放在連結交換和抓取量上,却忽略了一個更基础的损耗:同一個頁面被蜘蛛当成好几個不同的 URL 分別抓取。這類問题不會报错,日誌里也全是 200,但抓取量被白白摊薄。URL 規范化要解决的,就是让一個頁面只對應一個規范地址。
重复 URL 是怎么产生的
所谓重复,不是内容複製,而是同一份内容有多個可訪問地址。蜘蛛按 URL 记錄抓取歷史,地址不同就會被视為不同頁面,于是同一個入口頁可能被反复抓取,抓取记錄也被拆散。
三類最常见的来源
大小寫混用
HTTP 路径在多數服務器上区分大小寫,但不少程序在路由层會做不区分大小寫的匹配,结果 /Spider/、/spider/、/SPIDER/ 三條地址都能打開同一頁。内鏈里手寫不统一,或者模板里大小寫不一致,就會自然生成一批重复地址。
末尾斜杠與預設文件
同一個目錄通常有四種可訪問寫法:带斜杠、不带斜杠、顯式寫 index.html、只寫目錄名。服務器如果没有做统一跳轉,蜘蛛可能把這几種都抓一遍。這個問题的隐蔽之處在于,頁面内容和标题完全一样,肉眼检查很难發現。
查询參數
這類最容易被忽略,也最容易規模化。常见来源包括:
- 統計與投放參數,例如 ?from=、?utm_source=;
- 會话類參數,例如 ?sid=、?sessionid=;
- 排序與篩選參數,例如 ?sort=、?order=;
- 分頁參數與頁碼起始值不一致,例如第一頁既有 /list 也有 /list?page=1。
對内鏈来说,只要模板里带上一個參數,全站入口頁就會集体多出一份重复版本。
怎么從日誌里發現
- 取一段時間的訪問日誌,筛出蜘蛛 UA 的记錄。
- 把 URL 按“去掉查询參數後的路径 + 去末尾斜杠 + 轉小寫”归並,統計每個規范路径對應了多少個原始地址。
- 對归並结果排序,重点看那些原始地址數明顯大于 1 的路径。
- 抽查几條重复地址,確認返回狀態碼、正文長度和标题是否一致,排除真正的不同頁面。
很多时候你會看到某個入口頁有七八個抓取地址,而實际内容只有一份,這就是典型的浪費。
可以做的規范化處理
- 服務器层统一跳轉:把非規范寫法 301 到規范地址,例如统一轉小寫、统一补斜杠,並且只保留一種。跳轉鏈越短越好,避免多跳。
- 頁面层声明:規范版本的頁面用 canonical 指向自己,非規范版本不應作為獨立頁面存在。
- 參數层收敛:能去掉的參數尽量去掉;确實需要保留的排序、篩選類參數,避免寫進内鏈模板,必要时用 robots.txt 屏蔽參數模式。
- 提交层只给規范地址:sitemap 和主動提交里只放規范版本,不要把带參數的地址一起提交。
- 内鏈统一:全站導航、列表頁、正文連結的輸出格式保持一致,從源头减少重复地址的产生。
几個容易踩的邊界
規范化不是越激進越好。真正承载不同内容的分頁、語言版本、地区版本,不應该被硬性合並;參數屏蔽也要先確認没有屏蔽掉必要頁面。
URL 規范化能减少重复抓取、把抓取額度留给有效地址,但它只是抓取效率层面的整理工作,並不代表處理後就會被收錄或获得更好的排名。
建议把規范化当成一項日常检查:每隔一段時間看一次日誌归並结果,發現新的重复模式就顺手處理掉,比一次性大改更稳妥。