带 query 参数的 URL 在索引里变成一堆重复

Search Console 报上千条带 `?utm_*`、`?sort=`、`?ref=` 的重复 URL。用 rel=canonical 和干净内链把它们收敛掉。

Google Search Console 的 Page indexing 报告(Indexing → Pages,就是以前那个 “Index Coverage”)里冒出一堆你根本没打算发布的 URL:/products/laptop?utm_source=newsletter/products/laptop?ref=affiliate-42/products/laptop?sort=price&page=2&filter=brand-x。每个组合都被当成独立 URL。有的落到 Duplicate without user-selected canonical,有的落到 Alternate page with proper canonical tag,索引总数膨胀,排名信号被切散到各种变体上,Googlebot 把爬取预算浪费在几乎一模一样的页面上。

最快的修法:让每个页面都输出一个指向干净、无参数 URL(只保留 path)的 rel="canonical",并且别再在自己的内链里塞 tracking 参数。这一套组合拳就能把重复收敛掉。下面是细节,以及对付那些已经被索引的 URL 的清理办法。

先把定性说清楚:这不是惩罚。Google 没有”参数重复”这种惩罚机制——Duplicate without user-selected canonical 是一个合并/稀释问题,修法是告诉 Google 哪个 URL 是主版本,而不是删页面。另外要注意,Google 已经在 2022 年 4 月 28 日下线了 URL Parameters tool;你要是以前靠它,那个信号现在没了,替代品就是 rel="canonical"

先判断你属于哪一桶

改任何东西之前先诊断。搜一下 site:yoursite.com inurl:utm_(或 inurl:ref=inurl:sort=),打开 Page indexing 报告。

Search Console 里的症状最可能的原因主要修法
一堆 ?utm_* / ?ref= / ?gclid= URL 被索引tracking 参数被外部分享或被你自己的内链带上canonical 指向干净 URL + 内链去掉参数
一个分类下上千条 ?color=&size=&sort= 组合faceted navigation 笛卡尔爆炸canonical 指向干净 URL;低价值 facet 挡掉爬取
Duplicate, Google chose different canonical than user你的 canonical 信号弱/不一致内链 + sitemap + og:url 统一指向干净 URL
View Source 里参数 URL 把自己当 canonicalcanonical 从 request.url 构造(带了 query)canonical 只用 pathname 构造
页面上根本没有 <link rel="canonical">模板缺这个标签加一个去掉参数的自指 canonical

常见原因

1. UTM 和 tracking 参数被索引

邮件营销和广告会加 ?utm_source=...&utm_medium=...。用户点进来、分享 URL、被博客转贴,每个带参数的变体都会被发现、被索引。

怎么判断:Google 搜 site:yoursite.com inurl:utm_。有结果就说明带 UTM 的 URL 被索引了。

2. Affiliate ref 参数被索引

?ref=partner-123 本意是追踪来源,但 Googlebot 把它当独立 URL。

怎么判断:Search Console → 对一个 ?ref= URL 做 URL Inspection。它会跟干净 URL 一起显示为已索引。

3. Filter 和 sort 参数搞出笛卡尔爆炸

电商分类页带筛选:?color=red?color=red&size=l?color=red&size=l&sort=price。组合数是指数级的。Google 把这叫 faceted navigation,并明确把它列为最常见的爬取膨胀来源之一。

怎么判断:在 Page indexing 报告里数一个分类下的不同 URL 数。上千就是 filter 在爆。

4. 分页 + filter 双重叠加

?page=2?page=2&filter=brand?page=2&filter=brand&sort=price。每个 filter 组合又长出自己的一棵分页树。

怎么判断:Page indexing 报告里看 Duplicate, Google chose different canonical than user 这一项,很多行共用同一个 canonical 根。

5. canonical 缺失,或者自指向参数变体

模板没有 <link rel="canonical">,Google 只能自己猜主版本。或者 canonicalrequest.url 构造、带上了 query string,参数变体就把自己当成了 canonical。

怎么判断:view source /products/laptop?ref=foo。canonical 如果是 https://yoursite.com/products/laptop?ref=foo,那是自己指自己;如果完全缺失,Google 就靠猜。

6. 内链自带 tracking 参数

首页用 /products/laptop?utm_source=homepage 链产品,想做埋点。结果 Googlebot 看到的目标就是带参数的 URL。Google 明确警告:不要在内链里带 session ID、tracking code 这类临时参数,原因正在于此。

怎么判断:检查渲染后首页 HTML 里的 anchor 标签。任何带 ?utm_* 的内链都在漏。

7. 还在假设老的 “URL Parameters tool” 配置生效

你之前在 Google URL Parameters tool 里配过 refsort 等的处理规则。Google 已于 2022 年 4 月 28 日 下线该工具。那份配置现在毫无作用,它提供的信号也没了。

怎么判断:你记得配过,但从没用 rel="canonical" 替代过——那你现在就是在裸奔。

最短修复路径

第 1 步:盘点参数 URL

# 从 Search Console "Pages" 导出里抽样
grep -oE '\?[^"]+' search-console-export.csv | sort | uniq -c | sort -rn | head -30

把参数分两桶:trackingutm_*refgclidfbclidmsclkid)和 contentpagesortfilterlang)。tracking 参数永远不配拥有自己的索引 URL;部分 content 参数则配。

第 2 步:canonical 指向干净 URL

模板里 canonical 只用 URL pathname 构造、去掉 query string——除非某个参数实质性改变了内容。这正是 Google 的建议:“use the URL with the query parameter omitted as the canonical URL.”

// pages/products/[slug].astro
const url = new URL(Astro.request.url);
const canonical = `https://yoursite.com${url.pathname}`;  // 不带 query
---
<link rel="canonical" href={canonical}>

分页是真内容的地方(第 2 页列的是不同产品),就在那条 URL 的 canonical 里保留 ?page=2,让每页自指。任何真正改变页面的参数(?lang=de,或换了主图和价格的产品变体)也照此处理。

第 3 步:去掉内链上的 tracking 参数

审你的 anchor 标签。把内链 <a href="/products/laptop?utm_source=homepage"> 改成 <a href="/products/laptop">。点击来源改用 JavaScript 在 click 时记录(或用 first-party 事件),别塞进 href。一致性是 canonical 选择里最大的杠杆——内链、sitemap、og:urlrel="canonical" 都指向同一个 URL 时,Google 会给你回报。

第 4 步:用 robots.txt 管 faceted-navigation 的爬取——是管爬取,不是做 canonicalization

对没有 SEO 价值的电商 filter/sort URL,你可以干脆不让 Googlebot 爬:

User-agent: *
Disallow: /*?*sort=
Disallow: /*?*filter=
Disallow: /*utm_

有两个常把人坑住的点:

  • 别用 robots.txt 做 canonicalization。 Google 说得很直白:被 robots.txt Disallow 的 URL 如果有别人链它,仍然可能被索引;而且因为 Googlebot 读不到页面内容,它也读不到你的 canonical tag。所以 robots.txt 和 rel="canonical" 解决的是两件事——robots.txt 在垃圾 facet 上省爬取预算,canonical 收敛排名信号。还需要 Google 读到的 canonical 信号的 URL,别去 Disallow 它。
  • 如果你确实想让 faceted URL 可被索引,Google 的技术要求是:用标准的 & 做分隔符、保持一致的 filter 顺序、空筛选组合返回 404

不想直接挡爬取的话,可以给 filter 链接加 rel="nofollow"、给干净 URL 加 rel="canonical";按 Google 的说法,这会随时间降低非 canonical 变体的爬取量。

第 5 步:已被索引的烂 URL 用 Removals 工具清

Search Console → Removals → Temporary removals,挑最严重的删。这只是把它从搜索结果里藏约 6 个月;长期修复必须靠 canonical 加内链清理。删除只是争取时间,不是解决方案。

第 6 步:盯 “Duplicate, Google chose different canonical than user”

在 Page indexing 报告里,如果 Google 选了某个参数 URL 当 canonical 而不是你指定的那个,说明你的信号弱或互相矛盾。加强方法:

  • 几乎所有内链都指向干净 URL。
  • 确认 sitemap 只列干净 URL(sitemap 是较弱的 canonical 信号,但起码不能跟 rel="canonical" 打架)。
  • og:url 和 Twitter Card URL meta 也用干净 URL。
  • 别给出互相矛盾的信号——别让 redirect、sitemap、canonical 指向三个不同的 URL。

第 7 步:观察 4–8 周

canonical 重新处理一般要 2–6 周(高权重站更快)。Page indexing 里的”已索引”总数应随合并下降,Performance 报告里干净 URL 的曝光应上升。再跑一遍开头那条 site: 查询,确认参数 URL 在掉出去。

怎么确认修好了

  1. view source /products/laptop?ref=foo——canonical 必须是 https://yoursite.com/products/laptop,而不是那个参数 URL。
  2. 对一个参数 URL 做 URL Inspection——“User-declared canonical” 应是干净 URL,时间长了 “Google-selected canonical” 也应跟它对上。
  3. site:yoursite.com inurl:utm_ 的数量往零走。
  4. Page indexing 报告里 Duplicate without user-selected canonical 的数量逐周下降。

哪些情况不是你操作错了

外站带参数链你的 URL,你控制不了。canonical tag 能正确处理——Google 会跟你的提示走,把链接权重收敛到干净 URL 上。

容易误判的情况

误判成 duplicate content penalty。参数重复没有惩罚——这是发现和稀释问题。修法是合并,不是 de-index;在这儿伸手去用 noindex 反而会害你(见 FAQ)。

预防建议

  • canonical 默认只用 pathname;只对真正改变内容的页面类型按需 opt-in 加参数。
  • 内链永远不带 UTM;来源追踪用 JS click handler 或 first-party 事件。
  • 每月审一遍 Page indexing 报告里的参数爆炸。
  • robots.txt 把垃圾 facet 挡掉以保护爬取预算——但收敛机制始终是 canonical。
  • 明确文档化:哪些参数改内容(canonical 和 sitemap 要带)、哪些只是 tracking。

FAQ

  • 参数 URL 重复会被 Google 惩罚吗? 不会。没有参数重复惩罚这回事。这是合并问题,rel="canonical" 能修。
  • 参数 URL 应该用 noindex 而不是 canonical 吗? 不应该。noindex 会把 URL 丢掉、连同它的排名信号一起丢;canonical 是把信号合并到干净 URL 上。优先 canonical。noindex 留给那些永远不该排名的页面(站内搜索结果、致谢页)。
  • 我直接在 robots.txt 里把参数挡掉不行吗? robots.txt 只挡爬取,被挡的 URL 如果有外链仍可能被索引——而且 Googlebot 抓不到它,就永远看不到你的 canonical。robots.txt 只该用来在没价值的 facet 上省爬取预算,绝不能当 canonicalization 的手段。
  • URL Parameters tool 为什么没了? Google 在 2022 年 4 月 28 日下线了它,因为它的爬虫已经能很好地猜参数意图(只有约 1% 的配置真有用)。改用 rel="canonical"、干净内链,以及 robots.txt 做爬取控制。
  • 分页显示成重复——第 2 页该 canonical 到第 1 页吗? 不该。如果第 2 页列的是不同产品,那它就是独立内容,?page=2 应该自指 canonical。把所有分页都 canonical 到第 1 页会让深层产品对 Google 隐身。

相关阅读

标签: #SEO #排查 #收录 #Search Console #Canonical #query-parameters