同一個頁面,蜘蛛可能看到好几個地址:带 www 和不带、结尾有没有斜杠、參數顺序不同、路径大小寫不一样,再加上各種追踪參數和會话 ID。這些地址如果都返回 200,蜘蛛通常會把它們当作彼此獨立的 URL 分別抓取。canonical 的作用就是告诉蜘蛛哪個才是要留下的那一個,但它只是提示,不是命令。
重复 URL 是怎么多出来的
大多數站点的重复地址並不是刻意造出来的,而是几類常见来源叠加的结果:
- 协议與主机名變体:http 與 https、带 www 與不带 www 同时可訪問。
- 路径细节:结尾斜杠有無、大小寫混用、URL 末尾多出 index.html。
- 參數排列:同一组篩選參數換顺序、自動附加的 utm 追踪參數、會话 ID。
- 功能頁副本:打印版、分享版、排序方式、每頁條數切換。
這些地址往往内容几乎一致,但蜘蛛要分別請求、分別下载、分別解析。數量一多,抓取配額就被摊薄了。
三種處理方式,力度並不一样
301 永久重定向
力度最强,蜘蛛看到 301 後一般會把舊地址的權重和抓取信号轉移到新地址,並在後續抓取中直接使用新地址。适合协议、主机名、大小寫、结尾斜杠這類有唯一正确答案的變体。代價是每多一跳就多一次請求,所以尽量不要串成多級跳轉。
canonical 标簽
力度中等,是建议而非指令。蜘蛛仍會抓取带 canonical 的頁面,只是倾向于把信号归到目标 URL 上。它适合内容确實重复、但两個地址都有存在理由的情况,比如同一商品的不同篩選视图、有多語言版本的頁面。canonical 寫成相對路径、寫成带參數的地址、指向一個 404 或重定向目标,都是常见错誤。
robots.txt 屏蔽
力度看似最强,實际上限制的是抓取而不是索引。被屏蔽的 URL 蜘蛛抓不到,也就讀不到上面的 canonical,外部連結指向它时反而可能造成困惑。一般不建议用 robots.txt 去處理重复内容,更适合處理确實没必要抓取的目錄。
寫法上容易踩的坑
- canonical 與内鏈不一致:頁面 canonical 指向 A,站内連結却大量指向 B,两個信号互相打岔。内鏈最好统一用規范形式。
- 分頁頁面全部 canonical 到第一頁:這會让後續頁面的内容信号向第一頁集中,翻頁路径的抓取也可能變少。分頁一般让每頁 canonical 自身更稳妥。
- Sitemap 里混入非規范地址:Sitemap 是主動提交抓取入口的地方,里面出現带參數的重复 URL,等于自己把重复地址再报一遍。
- canonical 指向被 noindex 的頁面:两個信号冲突,蜘蛛需要自行判断,结果往往不如预期。
- 只寫 canonical,不做服務端跳轉:能跳的重复地址尽量在服務端跳掉,剩下的再交给 canonical,比全压在标簽上更干净。
配套要做的几件事
- 在服務器层面對大小寫、结尾斜杠、主机名做统一跳轉,規則越简單越好。
- 篩選、排序參數如果内容差异不大,可在服務端直接輸出規范頁,避免為每種參數组合生成獨立 URL。
- 外鏈和站内連結尽量只使用一種形式的地址,减少被動产生的變体。
- 定期翻看服務器日誌,看蜘蛛抓取的 URL 中有多大比例属于重复變体。這個比例比抓取總量更有參考價值。
canonical 不是把重复 URL 變没,而是把散落的抓取信号收拢到一個地址上。真正减少浪費的,還是服務端跳轉、统一内鏈和干净的 Sitemap。
最後提醒一点:重复 URL 的處理效果需要一段時間才能從日誌里看出来,改完之後不必天天盯着抓取曲线。把入口理干净,让蜘蛛少走几條弯路,已经是有意义的優化。