站内内容重复时,最常见的处理办法是加 canonical 标签,告诉搜索引擎“几个地址里,哪个才是正式版本”。但实际操作中,canonical 常常不是没起作用,而是被写成了另一种问题:本来自指的页面被指向别处,或者指向了一个根本不能作为正式版本的地址,结果收录归属越来越乱。
canonical 只是提示,不是命令
先说一个容易被误解的前提:canonical 是给搜索引擎的建议,不是强制指令。系统会结合内链、sitemap、重定向、页面相似度等信息综合判断,如果这些信号相互矛盾,canonical 可能被忽略。所以排查时不要只盯着这一行代码,要把它和别的信号放在一起看。
几类常见的写偏方式
- 指向跳转地址:canonical 指向的 URL 会 301 到别处。此时应该直接指向最终地址,中间多一层没有意义。
- 指向不可索引的页面:目标页被 robots.txt 屏蔽、带 noindex,或者返回 404、5xx。正式版本自己都进不了索引,合并自然无从谈起。
- 多个 canonical:模板和 CMS 插件各输出一份,HTML 里出现两条不同地址。搜索引擎通常只能选一条,或者直接忽略。
- 内容并不相同:把两个主题不同的页面用 canonical 强行合并,属于误用;canonical 用于高度相似或完全相同的正文,不用于“权重传递”。
- 相对路径或大小写、协议不一致:多数情况能被解析,但和实际地址不逐字一致时,容易让判断产生偏差。
- 分页页面全都指向第一页:这是一种取舍,不是绝对错误,但会让后续分页里的内容失去被发现的机会,需要结合业务决定。
- 靠 JS 动态写入:如果 canonical 只有脚本执行后才出现,要确认渲染环节能读到它,否则抓取早期看到的页面是缺失这个信号的。
按顺序自查一遍
- 确认这个页面本身是否应该被收录。如果内容单薄、只是聚合入口或临时页面,该做的是 noindex 或收敛入口,而不是加 canonical。
- 检查 canonical 是否为自指(默认情况应当自指),且与实际地址逐字一致,包括协议和大小写。
- 打开 canonical 指向的地址,确认返回 200、没有 noindex、没有被 robots.txt 屏蔽,并且能被正常抓取。
- 核对该地址是否出现在 sitemap 中、是否在站内有正常入口、内链是否也指向它。信号一致时,判断成本最低。
- 处理完观察一段时间,用站内搜索或 URL 检查工具看归属是否收敛,不要当天改当天就下结论。
别把 canonical 和另外两件事混在一起
一是抓取与收录的区别:canonical 影响的是“收录哪一个”,前提是相关 URL 已经被抓取。目标页长期抓不到,合并效果就无从体现。二是重复内容与收录取舍的区别:重复内容不等于惩罚,很多情况下搜索引擎会自行选择版本,canonical 只是降低它选错的概率。
一句提醒:canonical、noindex、robots.txt、重定向是四件互相独立的事,用错组合时,经常出现“以为屏蔽了却还在收录”或“以为合并了却两个都在”的情况。
如果站内确实存在大量参数页、筛选页,与其逐页纠 canonical,不如先从入口和链接结构上减少低价值 URL 的产生,再处理剩下的部分,成本会低很多。