很多站点在做收錄检查时會遇到一種情况:某個頁面的内容只有一份,但索引里、日誌里、後台統計里却出現了好几個地址。它們指向同一個模板、同一段正文,只是 URL 長得不太一样。這不是抽象的“内容重复”問题,而是很具体的 URL 變体問题。先把它排查清楚,再谈收敛。
常见的 URL 變体從哪里来
- 大小寫:/Product/ABC 與 /product/abc 在某些服務器配置下都能返回 200。
- 末尾斜杠:/list 與 /list/ 被当成两個地址。
- 預設文件名:/about 與 /about/index.html 同时可訪問。
- 协议與域名:http 與 https、带 www 與不带 www,几套组合各自能打開。
- 參數:追踪參數、排序篩選、分頁、會话 ID 都會生成新字符串。
- 编碼差异:中文或空格被不同方式编碼,拼接出不同 URL。
這些變体單獨看都不算错,但当它們同时可訪問、又都能被抓到时,問题就出来了:抓取被摊薄,權重信号被分散,日誌和後台統計里同一頁面被算成好几頁,判断問题的基础資料本身就失真了。
先统一統計口径,再判断問题。否則你看到的“頁面數”本身就是被放大的。
第一步:把候選 URL 归一化分组
從服務器日誌、站点地图、站内連結、搜尋结果里各取一批 URL,用一套简單規則做归一:去掉參數、统一小寫、去掉末尾斜杠、去掉預設文件名、统一协议與域名。归一後相同的算一组,看哪些组里有多個成員。
這一步的價值在于把“感觉有重复”變成“具体是哪几组有問题”,後續處理才有明确目标。
第二步:逐個變体看它現在的狀態
- 返回碼是什么,200、301 還是 404。
- 頁面里有没有 canonical,指向哪個地址。
- 内鏈和站点地图里用的是哪個版本。
- 這個變体是否被抓過,抓取频次如何。
常见的麻烦是信号互相打架:A 變体的 canonical 指向 B,B 又指向自己;或者内鏈指向 A,而站点地图寫的是 B。這種情况下蜘蛛只能自己猜,不同時間猜的结果還可能不一样。
第三步:定一個規范版本,其余收敛過去
規范版本通常選:全小寫、不带預設文件名、统一使用一個协议和域名版本、不带追踪參數。然後按下面几件事處理:
- 能在服務器层做 301 的就做 301。大小寫、末尾斜杠、index.html、www 與协议這几類一般可以用整批規則處理,成本低、见效快。
- 追踪參數優先交给 canonical 處理。不要直接把带參數的路径 Disallow 掉,被 robots 拦住的 URL,其 canonical 也可能讀不到。
- 内鏈、導航、站点地图、對外分享的連結统一改成規范形式,從源头上减少新變体产生。
- canonical 是提示而非命令,能配合 301 就配合,不要只留下這一套弱信号。
哪些變体不要急着收敛
带參數的篩選頁如果本身對應稳定的搜尋需求、内容也确實不同,就不该一刀切 301 到主列表頁。先判断它有没有獨立價值:内容是否稳定、是否有人主動搜、是否已有外部連結指向它。有價值就让它作為獨立頁面存在,canonical 指向自身,同时控制它被大規模抓取的范围;没價值的參數组合再用規則统一收掉。
改完之後怎么驗證
不要只看一两天。用归一化之後的口径去對比:
- 日誌里變体 URL 的抓取次數是否下降,規范版本的抓取是否相應上升。
- 索引里變体地址是否在逐步登出。這一步通常比抓取變化慢,需要更長观察期。
- 新生成的内鏈和 URL 里,是否還有新的變体冒出来。
如果几周後仍有變体在被大量抓取,多半說明源头没堵住:要么還有舊連結在外散播,要么服務器規則没覆盖到某一類寫法。
URL 變体不是一次就能清干净的事,它更像一種持續的卫生习惯:定好規范形式,让所有出口都用同一種寫法,剩下的交给 301 和 canonical 慢慢收敛。