做站点运营时,最容易被忽略的一类问题是:同一篇内容在站点里存在好几个可以访问的地址。用户看不出区别,蜘蛛却会把它当成多个页面分别处理。canonical 标签就是用来解决这个问题的,但用错了反而会添乱。
同一篇内容为什么会有多个地址
常见的来源包括:
- 带参数的地址,比如列表翻页、排序、来源追踪参数;
- www 与非 www、http 与 https 混用;
- 带尾斜杠与不带尾斜杠同时可访问;
- 打印页、移动版独立地址、专题聚合页;
- 内容被搬到站内其他栏目,留下了两份。
这些地址如果都返回 200 且都能被抓取,就等于把同一份内容重复投喂给搜索引擎。
canonical 在说什么
canonical 是写在页面 head 里的一个链接标签,作用是告诉蜘蛛:这一组相似页面里,哪一个是我认可的正式版本。
它是一条建议,不是强制指令。搜索引擎会参考,但如果页面上的其他信号(内链、Sitemap、重定向)与它互相矛盾,它很可能被忽略。
所以 canonical 要和内链、Sitemap、robots 放在一起看,单独设一个标签解决不了所有问题。
自查时容易踩的坑
1. 指向了不可访问的地址
canonical 指向的 URL 如果是 404、被 robots 屏蔽,或者本身还有重定向,这个标签基本失效。指向的地址自己要先能正常打开。
2. 页面之间互相指向
A 页写 canonical 到 B,B 页又写 canonical 到 A,形成循环。这种情况蜘蛛通常两边各按各的处理,等于白写。
3. 全站批量写死同一个地址
有些模板为了省事,把 canonical 统一写成首页地址。结果是所有内页都在说“我不是正主”,对收录非常不利。
4. 分页页面处理不当
分页的第二页、第三页不要 canonical 到第一页。它们各自是不同的内容列表,正确做法是保留自身地址,并做好上一页、下一页的关系说明。
5. 和重定向混着用
如果旧地址已经做了 301 到新地址,旧地址就不必再写 canonical。两者同时存在容易让信号混乱。
一份简单的自查清单
- 随机抽 20 个内页,查看源码中的 canonical 地址,确认能正常打开并返回 200;
- 确认 canonical 地址与页面实际 URL 的主机名、协议、尾斜杠写法一致;
- 检查是否存在 A 指向 B、B 指向 A 的循环;
- 检查列表页、筛选页是否误写了 canonical 指向首页或栏目首页;
- 对照 Sitemap,确认提交的地址与 canonical 指向的是同一个;
- 确认被 canonical 掉的地址没有被大量内链指向,否则信号会打架。
和 robots、重定向怎么分工
- robots.txt:控制蜘蛛能不能抓,不直接控制能不能收录,适合屏蔽无意义的参数地址;
- 301 重定向:地址永久搬家,权重与收录跟着走,适合改版和栏目合并;
- canonical:几个地址都能访问,内容高度相似,用来指定首选版本;
- noindex:明确不想要这个页面出现在结果里。
四者用途不同,别拿一个去替代另一个。
落地建议
站点规模不大时,可以先把 canonical 的模板逻辑固定下来:默认指向当前页面的规范地址,只在确实存在重复内容时才做特殊处理。改完之后,观察服务器日志里这些地址的抓取频次和状态码变化,往往比盯着一两个页面的标签更有用。
重复内容不是一夜之间出现的问题,解决它也不需要一次性全站推倒重来。按栏目分批梳理,先把明显重复的地址处理掉,再逐步收紧模板,是更稳妥的做法。