站内出現两個内容几乎一样的 URL 时,很多人的第一反應是加一條 canonical。但 canonical 具体该指向哪里,往往没想清楚就抄了模板,结果把本来有机會被收錄的頁面也一起交了出去。
canonical 是提示,不是命令
rel="canonical" 的作用是告诉搜尋引擎:這一组 URL 里,我認為哪個是主要版本。它是信号,不是重定向,也不阻止抓取。搜尋引擎會结合内鏈、sitemap、頁面内容、外鏈等因素综合判断,可能采纳,也可能不采纳。
所以寫 canonical 要有個前提:頁面之間确實高度重复,或互為變体,才需要收敛。内容本来就不同的两個頁面硬加 canonical,只會让其中一個白白失去被收錄的机會。
大多數頁面應该指向自己
每個正常頁面最好都有一條指向自身的 canonical。看起来多余,但确實有用:
- 模板自動生成的 canonical 一旦出错,比如域名或語言寫错,自指能避免它被错誤繼承;
- 减少參數、大小寫、协议等變体带来的歧义;
- 内容被其他工具采集、拼接後,原始版本是哪一條仍然说得清。
什么时候该指向別的 URL
比較典型的有几類:
- 參數變体:同一篇内容因為跟踪參數、排序參數产生了多個 URL,把带參數的版本指向不带參數的版本;
- 打印頁、纯文本頁:一般指向正常浏览版本;
- 多域名或 www 與非 www 同时可訪問:可以指向主域名版本,但更稳妥的做法仍是 301;
- 同一内容被放在多條路径下:比如同时出現在两個栏目里,需要選出主路径。
分頁不要简單地全部指向第一頁
把 page/2、page/3 全部 canonical 到第 1 頁,是常见操作错誤。這些頁面各自有不同内容,通常應自指,再依靠内鏈让抓取路径保持通畅。
几種常见的誤用
- canonical 指向一個會 301 的 URL。鏈條一長,信号容易被忽略,應直接寫成最终地址。
- canonical 指向被 noindex 的頁面。两個信号互相矛盾,结果可能是两邊都進不了索引。
- 全站共用一個 canonical。多半是模板變量没渲染出来,等于把整站内容都指向同一頁。
- canonical 指向不存在的 URL,或相對路径寫错。检查时以浏览器「查看網頁源代碼」里的實际輸出為准,而不是模板文件。
- 跨域 canonical 用得太随意。它可以是内容被轉载後的补救手段,但如果目标站点不由自己控制,效果並不稳定。
和 sitemap、内鏈、重定向怎么配合
canonical 單獨用效果有限,需要和其他环节说同一件事:
- 内鏈尽量指向規范版本,別让用戶和蜘蛛都涌向變体 URL;
- sitemap 里只放規范版本,把變体排除在外;
- 如果是永久迁移,比如換域名、改目錄结构,用 301 而不是 canonical;
- 規范版本的頁面本身要可抓取、可索引、返回 200。
如果規范版本自己都没有入口連結,或者被 robots、noindex 挡住,canonical 寫得再規范也没有意义。
怎么確認有没有生效
几個可操作的检查点:
- 用站内工具或抓取脚本抽查頁面的 canonical 實际輸出,確認没有空值、没有拼接错誤;
- 在搜尋平台的 URL 检查工具里,看「用戶声明的規范網址」和「系統選擇的規范網址」是否一致;
- 隔一段時間再看,用索引狀態查询確認變体頁面是否在收敛;
- 對照抓取日誌,看看變体 URL 的抓取频次有没有下降。
canonical 解决的是「選哪個版本」的問题,解决不了内容本身质量低的問题。如果两個頁面都只是薄内容的模板頁,收敛之後剩下的那一個,也不一定就會被收錄。