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

Search Console 报上千条带 `?utm_*`、`?sort=`、`?ref=` 的重复 URL,每个参数组合都被当独立页面索引了。

Search Console Pages 报告里出现一堆奇怪 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 canonical”,索引总数膨胀,真内容被稀释,排名信号被切散到各种变体,Googlebot 把爬取浪费在几乎一模一样的页面上。

修法:用 rel=canonical 收信号、在 URL 构造层处理营销参数、明确告诉 Google 哪些参数改内容、哪些只是 tracking。

常见原因

1. UTM 和 tracking 参数被索引

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

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

2. Affiliate ref 参数被索引

?ref=partner-123 用来追踪来源,但 Googlebot 当独立 URL。

怎么判断:Search Console → Pages → 对 ?ref= URL 做 URL Inspection。会看到跟干净 URL 一起被索引。

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

电商分类页带筛选:?color=red?color=red&size=l?color=red&size=l&sort=price。组合数指数级。

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

4. 分页 + filter 双重叠加

?page=2?page=2&filter=brand?page=2&filter=brand&sort=price。每个 filter 组合都有自己的分页树。

怎么判断:Search Console “Excluded” 报告 → “Duplicate, Google chose different canonical”——同一个 canonical 根下一大片。

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

模板没 <link rel="canonical">,Google 没法判断主版本。或者 canonicalrequest.url 构造、带上参数,参数变体就变成自己的 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。

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

7. 老的 “URL Parameters tool” 配置失效了

之前在 Google URL Parameters tool 里配过 refsort 等的处理规则。Google 2022 年废弃了这个工具。你的配置不再生效,对应的信号没了。

怎么判断:你记得配过但没用 canonical tag 替代过,那你现在在裸奔。

最短修复路径

第 1 步:参数 URL 盘点

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

把参数分两桶:tracking(utm_*、ref、gclid、fbclid)vs. content(page、sort、filter、lang)。

第 2 步:canonical 指向干净 URL

模板里 canonical 从 URL pathname 构造、去掉 query string——除非参数实质性改变内容:

// 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 页是不同内容),canonical 里就保留 ?page=2

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

审 anchor。把内链 <a href="/products/laptop?utm_source=homepage"> 改成 <a href="/products/laptop">。来源追踪改用 JS click(点击时设 UTM 等价物),不放进 href

第 4 步:用 robots.txt 处理非内容参数的爆炸

无 SEO 价值的电商 filter URL:

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

跟 canonical 配合用。注意:Disallow 阻止爬取,但外链导入的 URL 仍可能被索引——canonical 才是真正做收敛的。

第 5 步:已经被索引的烂 URL 用 Search Console “Remove URLs”

Search Console → Removals → 最严重的临时删除。长期修复必须靠 canonical + 内链清理;删除只是争取时间。

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

Search Console Pages 报告。Google 选了参数 URL 而不是你指定的当 canonical,说明你的 canonical 信号弱。加强方法:

  • 99% 内链指向干净 URL。
  • 确认 sitemap 只列干净 URL。
  • og:url 和 Twitter Card URL meta 也用干净 URL。

第 7 步:观察 4-8 周

Search Console “Pages” 总数应随合并下降。干净 URL 的曝光应上升。

哪些情况可能不是你操作错了

外站带参数链你的 URL,控制不了。canonical tag 能正确处理——Google 会跟你的提示走。

容易误判的情况

误判成 duplicate content penalty。参数重复没有惩罚——这是发现和稀释问题。“修法”是合并,不是 de-index。

预防建议

  • canonical 默认只用 pathname;按页面类型 opt-in 加参数。
  • 内链永远不带 UTM;用 JS click handler 追踪来源。
  • 每月审 Search Console Pages 报告里的参数爆炸。
  • robots.txt 把 tracking 参数挡掉,做 belt-and-suspenders。
  • 明确文档化:哪些参数改内容(canonical/sitemap 要带)、哪些只 tracking。

FAQ

  • 参数 URL 重复会被 Google 惩罚吗? 不会——是稀释问题不是惩罚。canonical 能修。
  • 参数 URL 应该 noindex 而不是 canonical 吗? 不应该——noindex 丢排名信号,canonical 合并它们。永远优先 canonical。

相关阅读

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