同一個頁面在服務器上可能有好几種寫法:带 www 和不带 www、http 和 https、末尾带斜杠和不带、路径里大寫和小寫。對訪問者来说它們看起来是同一個頁面,對搜尋引擎来说它們是不同的 URL。如果不做收口,抓取、外鏈和統計資料會被分到几個地址上,收錄表現自然好不了。
先認清變体從哪来
- 协议與主机名:http 與 https、example.com 與 www.example.com,常因為早期配置残留而同时可訪問。
- 末尾斜杠:/about 與 /about/,目錄寫法和文件寫法混用。
- 大小寫:/About、/about、/ABOUT 在多數服務器上指向同一内容,但 URL 字符串不同。
- 預設文档:/index.html 與根目錄内容重复。
- 參數顺序:同一组篩選參數顺序不同,也會生出多個地址。
這些變体的共同点是:内容一样,URL 不一样。它們不會自動互相抵消,而是各自被当成一個候選頁面。
做一次全站盘点
收口之前先知道自己有多少變体。可以按下面的顺序查:
- 從服務器日誌里筛出返回 200 的 URL,按主机名和协议分组,看有几種前缀。
- 把 sitemap 里的地址去重,检查是否混入了非主版本的寫法。
- 抽查站内連結:導航、面包屑、正文連結、分頁連結是否指向同一個版本。
- 看站長工具里的頁面报告,留意被标记為重复或未選擇規范頁面的地址。
盘点的重点是找出谁在指向哪個版本,而不只是統計有多少個地址。
選定主版本並一次跳到位
主版本的選擇没有绝對标准,取一個就好:通常選 https 加带 www 或不带 www 中歷史外鏈更多的那一個,路径统一小寫、目錄地址统一带末尾斜杠。定下来之後:
- 服務器层把其余變体 301 到主版本,直接跳到最终地址,不要先跳 www 再跳 https 再补斜杠。
- 站内所有連結改成主版本,包括導航、分頁、相關推荐和 sitemap。
- 頁面里的 canonical 指向主版本,並且保持自指,即主版本頁面 canonical 就是它自己。
大小寫要單獨處理
如果服務器對大小寫不敏感,/About 和 /about 會返回同一份内容,但 URL 字符串仍然不同。這时不要在不同大小寫下輸出不同的 canonical,直接让所有變体 301 或 canonical 到小寫版本即可。若服務器区分大小寫,則要確認没有两條真實存在的路径只差大小寫。
服務器規則別做過头
跳轉規則寫得越复杂,越容易出現连环跳轉或被誤伤。改規則前先在測試环境驗證几组地址:根目錄、带參數、带末尾斜杠、大小寫混合,確認都是一次跳到正确地址。
收口的目标是让一個頁面只有一個可被引用的地址,不是把所有可能的寫法都用規則堵死。
收口之後怎么驗證
- 批量請求一批變体地址,看返回碼是否為 301,且 Location 指向主版本。
- 用抓取工具或日誌確認蜘蛛最终停留在主版本地址上。
- 抽查頁面源碼里的 canonical 是否随 HTML 一起返回,避免依赖脚本注入。
- 過一段時間再看索引情况,變体地址會逐步登出,速度不會很快。
几個常见的错誤做法
- 同时用 301、canonical、noindex 三種方式指向不同地址,信号互相矛盾。
- 只在 sitemap 里改主版本,站内連結和跳轉規則没動,蜘蛛還是會先撞上變体。
- 為了统一斜杠,對已经是主版本的地址也加了一條跳轉,形成自跳。
- 把變体頁面内容清空或返回 404,而不是跳轉,導致原有外鏈失效。
URL 變体不是什么大問题,但它會長期消耗抓取资源、稀释信号。把主版本定下来,跳轉做一次到位,内鏈和 sitemap 跟上,剩下的交给時間。