canonical 标簽的作用很窄,也很明确:告诉搜尋引擎,這一组内容相近的 URL 里,哪一個是你希望被当作代表。它不阻止抓取,也不保證收錄,只是一個信号。寫對了,能帮索引把重复的地址收敛到一條;寫错了,反而會把本来好好的頁面指向別處。
canonical 只解决一個問题:哪條 URL 算數
当同一個頁面能通過多條 URL 訪問——带不带 www、末尾有没有斜杠、參數顺序不同、大小寫不同——索引里就可能出現好几條记錄。canonical 的作用是让你指定其中一條作為代表,其余的作為重复項處理。它不會让頁面消失,也不會让頁面被收錄,只是把“哪一條算數”说清楚。
寫成噪音的几種常见情况
1. 指向了一個會跳轉的地址
比如頁面本身是 https 版本,canonical 里却寫着 http 版本;或者 canonical 指向的地址自己又 301 到別處。這類寫法會多出一條鏈路,搜尋引擎需要多走一步才能找到真正的代表頁。規范的做法是,canonical 直接寫成最终可訪問的那個地址——返回 200、不跳轉、可索引。
2. 鏈式指向和互相指向
A 頁 canonical 指向 B,B 頁 canonical 又指向 C,這叫鏈式;A 指向 B,B 又指回 A,這叫环状。两種都會让信号變模糊。理想情况是同一组内容里,所有頁面都直接指向同一個代表地址,而代表頁 canonical 指向自己。
3. 模板里寫死,全站都指向首頁
有些站点在模板头部加了一行 canonical,變量没生效,结果每一頁都指向首頁。這等于告诉搜尋引擎,所有頁面都是首頁的副本。發現索引里大量頁面被替換成首頁时,往往要從這里查起。
4. 大小寫、协议、斜杠不一致
canonical 里寫的地址和頁面實际地址不完全一致——比如 /Page 與 /page,或者丢了末尾斜杠——都算两個不同地址。寫之前建议直接複製地址栏的最终 URL,而不是手敲。
5. 和 noindex、robots.txt 打架
如果一個頁面自己带着 noindex,同时又 canonical 指向另一個頁面,两個信号會互相牵扯:noindex 说的是“別索引我”,canonical 说的是“索引那條”。搜尋引擎通常會更谨慎地處理這種组合。想让頁面登出索引,用 noindex 就够了;想让重复地址合並,用 canonical。两者不要混用在同一個頁面上,除非你清楚自己在做什么。
一個简單的判断标准:如果你自己也说不清這两條 URL 该保留哪一條,搜尋引擎同样说不清。
分頁和參數頁面上的寫法
分頁頁面比較微妙。第 2 頁、第 3 頁的内容和第 1 頁不同,它們不是重复頁面,一般不需要互相 canonical。真正需要處理的是那些“同一批结果、只是排序或篩選參數不同”的地址——這類通常 canonical 到不带參數的干净地址。
還有一種做法是把所有分頁都 canonical 到第 1 頁。這會让後續頁面很难作為獨立入口被用戶看到,是否采用要看你的目的:如果只是想让搜尋引擎別把參數頁面当成重复内容,收敛參數比收敛分頁更合适。
跨域 canonical 要慎重
canonical 允许指向其他域名,比如原站和轉载站之間的處理。但前提是两個頁面内容确實高度一致,而且目标是你自己能控制的域名。指向一個你不控制的站点,等于把代表權交出去,事後很难收回来。
怎么自查
- 随机抽几個頁面模板,看 canonical 是否為绝對地址、是否與目前 URL 一致。
- 看 canonical 指向的目标返回什么狀態碼,是否 200、是否可索引。
- 在搜尋结果里用 site: 查完全相同的标题,看是否出現多條来自不同 URL 的结果。
- 观察搜尋控制台里“重复網頁,用戶未選定規范網頁”這類提示,數量突然上升时排查模板改動。
小结
canonical 是一個建议,不是命令。它的價值在于减少同一個内容的多個地址對抓取和索引的分散,而不是用来控制收錄與否。寫之前先想清楚:這個内容组里,哪一條 URL 是你真正愿意對外展示的。想清楚了,再寫那一行代碼。