在抓取統計或服務器日誌里,你可能见過這種情况:同一篇文章對應好几條 URL,參數顺序不同、大小寫不同、结尾多一個斜杠,甚至主机名都不一样。這些地址打開後是同一份内容,但在搜尋蜘蛛眼里,它們是几個各自獨立的 URL。索引里最终挑中哪一版,通常不完全由你决定,所以更稳的做法是在站点层面先把地址归一。
常见的 URL 變体
- 协议與主机名:http 與 https 並存、带 www 與不带 www、带預設端口與不带端口。
- 路径寫法:结尾加不加斜杠、是否附带 /index.html 或 /index.php、目錄名的大小寫不同。
- 參數部分:篩選參數顺序不同、跟踪參數被寫進内部連結、會话 ID 直接拼在地址里。
- 歷史遗留:改版前的舊路径仍能訪問、CDN 回源地址被頁面引用、測試环境域名偶然被放出到公網。
為什么归一比删内容更優先
多個版本同时被抓取,抓取額度被同一份内容摊薄;外鏈和站内連結分散在几個地址上,頁面获得的信号也被摊薄。更麻烦的是,索引里的選擇並不固定:今天留下带 www 的那一版,過一段時間可能又換成另一個,統計口径随之變化。
URL 归一是“让同一份内容只對應一個地址”,而重复内容處理是“不同内容之間如何取舍”。前者是後者的前提。
推荐的處理顺序
- 選定唯一地址,把协议、主机名、路径寫法、參數處理規則寫成規范,並落到模板和构建流程里,而不是靠人工逐個改。
- 把其它版本 301 到唯一地址,尽量一跳到位,避免 A→B→C 的鏈式跳轉。
- 站内連結、導航、分頁、面包屑、结构化資料里的地址全部換成唯一版本。
- 站点地图只放唯一版本,各種變体不要出現在里面。
- canonical 可以作為补充声明,但它替代不了 301:canonical 是提示,服務器跳轉是明确指令。
- 不要用 robots.txt 去挡變体。挡住抓取後,蜘蛛既看不到跳轉也看不到 canonical,這些地址反而可能繼續留在索引里。
驗證归一是否生效
- 在日誌里按主机名和路径去重統計,观察變体地址的請求占比是否下降。
- 用命令行工具查看變体地址的响應碼和 Location 头,確認是一跳 301,而不是 200 或多跳鏈路。
- 用站内查询或搜尋控制台的網頁报告,看同一份内容對應的地址數量變化。
- 注意索引更新有滞後,地址替換通常需要數周,不要改完第二天就下结论。
容易踩的坑
- 以為大小寫無關:部分服務器不区分大小寫,迁移到区分大小寫的环境後,/Page 和 /page 就成了两個地址。
- 忽略尾斜杠差异:有的框架把 /a 和 /a/ 当作不同资源處理。
- 同时做了两套归一:301 指向 A,canonical 却指向 B,等于给蜘蛛一個自相矛盾的信号。
- CDN 或反向代理把回源域名暴露在頁面里,凭空多出一批可抓取的地址。
URL 归一属于一次性工程,做完之後再看重复内容、參數頁、分頁這些话题會清楚很多。先把地址统一,再谈索引里留下哪一版;顺序反過来,往往是事倍功半。