canonical标签仅指定首选索引URL,不消除重复内容、不改变页面存在状态;必须唯一置于<head>中,href需为绝对URL且与目标页完全一致,动态页须过滤非语义参数,严禁与301或noindex混用。
canonical 标签不能“消除”重复内容,只能告诉搜索引擎你希望它优先索引哪个 URL;它不改变页面实际存在状态,也不阻止用户或爬虫访问其他变体。
<head> 里且只能有一个放错位置等于没写:比如写在 <body> 里、用 JavaScript 动态插入、塞进注释或外部 CSS/JS 文件中,Google 都不会识别。同一页面出现两个 <link rel="canonical">,搜索引擎可能直接忽略整条标签。验证方法很简单——打开网页源码(Ctrl+U),搜索 rel="canonical",确认它唯一、闭合、且在 <head> 区域内。
相对路径如 /article 或协议相对路径如 //example.com/article 极易出错:HTTP 页面里解析成 HTTP 地址,HTTPS 页面里却变成 HTTPS,CDN 域名或 www 切换时还会指向错误站点。正确写法必须带协议和完整域名:
<link rel="canonical" href="https://www.example.com/article">
注意以下细节:
立即学习“前端免费学习笔记(深入)”;
https:// 不能省略,否则 HTTP 环境下会降级为 HTTPwww.example.com 和 example.com 是两个不同规范域,选一个并全站统一/article/ ≠ /article
电商商品页带 ?utm_source=xxx&ref=abc&page=2 这类参数时,canonical 应指向无参或标准路径版本,但分页除外——第 2 页不能指向第 1 页,否则 Google 会认为该页无独立价值。常见处理方式:
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 提取路径,拼接 https://$_SERVER['HTTP_HOST']
getCanonicalUrl() 或自定义 hook 中剔除 tracking 类 query 参数,别直接用 router.asPath
route.path 构造,避免 route.fullPath(含 query)canonical 指向 PC 页后,PC 页却不加 <link rel="amphtml"> —— 双向对应缺一不可这是最容易踩的坑:
canonical 指回自己或跳转前地址noindex 页面上设 canonical 属于自相矛盾,Google 很可能忽略该 canonicalcanonical 没同步更新,仍指向前置路径,等于持续误导爬虫真正难的不是写那行代码,而是判断「哪些页面算重复」「哪个才是用户和搜索引擎都认可的主版本」——这个决策一旦出错,后续所有技术实现都会放大偏差。