同一個頁面被搜尋引擎用多個地址抓到,是站点运营里很常见、又容易被忽略的問题。它不一定立刻带来麻烦,但會让抓取、去重、統計都變得不确定:流量分散在几個 URL 上,改動某個地址之後效果也难判断。canonical 是處理這類問题的常用手段,但它不是寫上就好,寫得不對反而會传递错誤信号。
先找出站点里有哪些重复地址
- 带參數的地址:utm 系列、排序、篩選、每頁條數、會话 ID 等,内容一致也會被当成不同 URL。
- 大小寫與尾斜线差异:/Page 與 /page、/a 與 /a/,在多數服務器上會被当作两個地址。
- 协议與主机名差异:http 與 https、带 www 與不带 www 同时可以訪問。
- 移動版或獨立版本:m 子域、獨立移動域名與主站内容一致。
- 功能性副本:打印頁、纯文本版、AMP 版、PDF 導出頁。
- 跨站同步發布:同一篇内容先在自有站發布,再同步到其它平台,或反過来。
這几類地址如果長期並存,就會形成事實上的重复内容,用戶可能從任意一個進去,蜘蛛也可能按不同地址分別抓取。
canonical 常见的几種寫错方式
指向了一個打不開的地址
canonical 的目标應当是 200 狀態、可以正常訪問的規范頁。如果它指向的地址會 301、404,或者被 robots.txt 屏蔽,搜尋引擎無法確認你指的那個頁面,這條 canonical 基本等于没寫,副本仍可能按原地址處理。
多個地址互相指
A 頁 canonical 指向 B,B 又指向 C,或者 A 和 B 互指,形成鏈或环。這類情况多出現在改版、迁移没有清理干净的时候。建议把最终規范頁定下来,让所有副本都直接指向它,而不是层层轉指。
模板里硬编碼同一個 canonical
列表頁、分頁、篩選结果頁、詳情頁如果共用同一個模板,很容易把 canonical 寫死成栏目首頁或第一頁的地址。结果是大量不同内容的頁面都在声明自己不是正本。更稳妥的做法是让 canonical 由頁面自身地址生成,或按頁面類型分別配置。
canonical 與其他設定的冲突
- 同时寫 noindex 和 canonical:noindex 通常優先,頁面不參與索引,canonical 的作用也就無從体現,两者並用要先想清楚目的。
- 被 robots.txt 屏蔽的頁面:屏蔽之後搜尋引擎拿不到頁面内容,也就讀不到 canonical,副本依然存在但不被處理。
- 分頁:把第 2 頁及以後都 canonical 到第 1 頁,需要確認這些内容是否真的可以合並。如果每頁是不同的商品或文章列表,直接合並可能损失入口。
- 多語言:各語言版本之間用 hreflang 互指,各自 canonical 到自身;不要把它們互相 canonical,否則語言版本會被合並到一處。
- 协议與主机:先在服務器层面把 http 跳 https、把 www 统一,再用 canonical 兜底,比只依赖 canonical 更稳。
一次可执行的自查流程
- 從服務器日誌或抓取记錄里按内容聚類,看同一個頁面是否對應多個 URL。
- 挑出流量較高、被外鏈引用較多的頁面,逐個查看實际被訪問的地址。
- 打開頁面源碼,確認 canonical 是否存在、是否指向自身或明确的規范頁、目标地址是否正常返回。
- 抽查模板生成的頁面:列表頁、分頁、篩選结果頁、詳情頁各取几個。
- 检查 http 與 https、www 與非 www、大小寫、尾斜线,確認服務器层面的统一規則已经生效。
- 改完後记下修改時間,隔一段時間回看抓取與索引狀態的變化,不要指望当天就见效。
canonical 是一種声明,不是命令。它降低歧义,但不會替你解决服務器配置、内容重复和内部連結混乱的問题。先把地址统一做好,再让它做收尾。
建议的维護节奏
把 canonical 检查放進栏目上线和内容改版的流程里,比事後成批排查省事。新增頁面时確認模板輸出的地址正确,改版或換域名时整理一份地址對照表,避免新舊地址長期並行。對于带參數的篩選頁,可以提前约定哪些參數允许被抓取、哪些在服務器层面直接重定向到干净地址,减少後續的清理成本。