蜘蛛發現 URL 的方式很直接:顺着連結、Sitemap、日誌里的舊地址爬。但對它来说,URL 是一個字符串,不是“頁面”。字符串差一個字符,就可能被当成另一個地址。很多站点並不是内容重复,而是 URL 寫法重复,结果蜘蛛把同一份内容抓了好几遍,抓取预算被分散,日誌也變得难讀。
主机名和协议:先确定唯一的入口
主机名不区分大小寫,Example.com 和 example.com 對蜘蛛来说通常指向同一個站点,但协议和端口會带来分叉。
- http 與 https 是两個 URL,如果两個都能訪問,蜘蛛可能分別抓取。
- 带 :80、:443 的顯式端口和不带端口的寫法,最好统一。
- 带 www 與不带 www 的域名,選一個作為主域名,另一個做 301。
這些分叉一旦同时可訪問,蜘蛛不會自動帮你合並;它只會按照連結里出現的寫法去抓。
路径大小寫:服務器说了算
URL 路径部分通常区分大小寫。/About 和 /about 在多數 Linux 服務器上是两個不同地址。如果两都能返回 200,蜘蛛就會当成两個頁面。有些 CMS 或框架會自動做小寫重定向,有些不會,需要自己確認。
检查方法很简單:在服務器日誌里搜同一個路径的不同大小寫寫法,看是否都有蜘蛛訪問记錄。如果有,說明内鏈或外鏈里混用了。
末尾斜杠:/a 和 /a/ 不是一回事
末尾斜杠的處理方式因服務器和框架而异。常见情况有三種:
- 两者返回同一份内容,都是 200。
- 其中一個 301 到另一個。
- 两者返回不同内容,比如 /a 是列表,/a/ 是首頁。
第一種和第三種都容易让蜘蛛分別抓取。建议在服務器层统一:選一種寫法,另一種用 301 跳轉過去,並且内鏈、Sitemap、canonical 都用同一版本。
index 文件與目錄地址
/category/index.html、/category/、/category 在很多服務器上指向同一個文件。如果都返回 200,蜘蛛可能把它們当成三個地址。處理方式同样是挑一個規范地址,其余 301。
URL 規范化不是為了让蜘蛛少抓,而是让它把抓取次數用在真正不同的内容上。
查询參數:顺序和無關參數
參數也是 URL 字符串的一部分。?page=2&sort=new 和 ?sort=new&page=2 在蜘蛛眼里是两個 URL。跟踪參數、會话參數、排序參數如果大量出現在内鏈里,會制造出成倍的變体。
- 跟踪參數尽量在生成連結时去掉,或统一在服務端做 301。
- 排序、篩選參數如果内容相同,可以用 canonical 指向無參數版本,但不要指望它一定被采纳。
- 分頁參數要保留,因為那是不同内容。
把規范 URL 固定下来
做法不复杂,關键是统一:
- 在服務器配置里做 301,把大小寫、末尾斜杠、index 文件、預設端口归一到規范寫法。
- 内鏈生成时就用規范 URL,不要一會儿带斜杠一會儿不带。
- Sitemap 里只放規范 URL。
- canonical 标簽作為补充,指向規范地址。
做完之後,用日誌抽查一段時間,看蜘蛛是否還在抓非規范版本。如果還有,多半是外鏈或舊内鏈残留,可以慢慢清理,不必一次性追求零重复。蜘蛛的抓取安排會随着連結寫法稳定而逐渐收敛。