同一篇文章,如果在站内能从好几个网址打开,对访客来说差别不大,点哪个都能看。但对搜索引擎来说,这是典型的重复内容场景:同一份内容被当成几个页面分别收录、分别计算,抓取预算被摊薄,外链权重被分散,日志里也会反复出现同一篇内容的不同 URL,排查问题时更难看清楚。canonical 标签和网址规范化,就是用来把这类入口收口的工具。
先弄清一件事:同一篇内容可能有几个入口
在动手写 canonical 之前,先花十分钟列一下,你的站点到底通过哪些形式暴露同一个页面。常见的来源包括:
- 协议与主机名:http 与 https、带 www 与不带 www,如果四者都能打开,就有四个入口。
- 路径写法:带结尾斜杠与不带斜杠、目录名大小写不同、多余的 index.html。
- 参数:来源追踪参数、排序参数、会话 ID、分页参数。
- 功能页副本:打印版、移动版、AMP 版、分享预览页。
- 内容聚合:标签页、专题页、作者页把正文整段搬了过来,和原文高度重合。
把这些入口列成一张表,后面每一步自查才有对照物。
canonical 是提示,不是指令
需要先摆正预期:canonical 标签对搜索引擎来说是建议,不是强制命令。它不会自动让另一个网址消失,也不会改变访客实际访问的地址。真正让旧网址不再作为独立入口存在的,是301 重定向。所以一个合理的做法是:能重定向的尽量重定向,不能重定向或者需要保留访问的(比如带参数的跟踪链接),再用 canonical 指明规范版本。
把 canonical 当成“说明哪个版本是我认可的主版本”,而不是“让其他版本从索引里消失的开关”。
自查清单:从这几处逐个核对
1. 每个页面是否都有 canonical,且指向自己
很多站点的问题不是写错,而是漏写。用爬虫抓一遍全站,把返回状态码为 200 的 HTML 页面挑出来,逐个检查 head 里是否存在 canonical,并且它指向的地址与当前访问地址是否一致。如果列表页、分类页、详情页大量缺失,先补齐这一层。
2. canonical 指向的地址是否真实可访问
常见的坑有几种:canonical 写的是测试域名、写的是已经 404 的旧路径、写的是 http 而站点早已全站 https、多个页面互相指来指去形成环。这几种情况都会让标签失去意义。核对办法很简单——把全站 canonical 的地址抽出来,逐个请求一遍,只看状态码和最终跳转地址。
3. 分页页面不要全部指向第一页
列表翻到第 5 页,如果 canonical 仍然指向第 1 页,等于告诉搜索引擎后面几页都是重复的,那些页面上的内容就可能长期不被处理。分页的常规做法是让每一页 canonical 指向自身,或者至少不要一股脑指向首页。
4. 别让所有页面都指向首页
有些模板在开发阶段留了一句默认 canonical,结果整站几百个页面全部指向首页。这种情况比漏写更麻烦,因为它会主动传递一个错误信号。上线前用模板级别检查一次,比事后逐页翻要省事得多。
5. 动态渲染的页面,canonical 可能被改掉
如果 canonical 是由前端脚本注入的,要确认脚本执行后的最终结果,而不是只看初始 HTML。有些站点初始 HTML 写的是对的,脚本跑完之后反而被覆盖成当前带参数的完整网址。用支持执行 JS 的方式抓一次,对比两种结果。
6. 内链、站点地图、分享链接写法是否统一
规范化不只是标签的事。站内链接如果一半带 www、一半不带,一半带结尾斜杠、一半不带,搜索引擎顺着爬就会不断发现新变体。建议固定一种写法,然后检查导航、面包屑、正文内链、页脚、站点地图,让它们都指向同一个规范地址。站点地图里尤其不要出现重定向地址和带跟踪参数的地址。
把这件事变成定期动作
网址规范化不是一次性的上线检查。新栏目上线、换域名、加 CDN、改路由规则、接入新的营销追踪工具,每一步都可能引入新的地址变体。比较省心的做法是固定一个频率,比如每月一次,抓取全站页面,输出三份对照数据:返回 200 的页面清单、各自的 canonical 地址、内链与站点地图中出现的地址。三者对不上,就是需要处理的地方。
另外,抓取日志也值得顺手看一眼。如果同一条内容在日志里以多种 URL 反复出现,而且都被正常抓取,那基本可以确认规范化没做到位。这类问题越早收敛,后面的抓取效率越稳定。