站内链接带上 utm_、sid、sort 之类的参数,时间一长,索引里就可能多出一批“看起来像新页面、内容其实是同一份”的 URL。处理这类问题,先别急着在 robots.txt 里一刀切,因为屏蔽和归并是两件不同的事。
一、先把参数分成三类
不同来源的参数,处理方式差别很大。核对之前先给它们归个类:
- 追踪类:utm_source、utm_medium、gclid、fbclid、ref、spm 等,只在站外跳转或投放时出现。
- 筛选与排序类:color、size、price、sort、view、brand 等,由站内筛选器生成,可能组合出成百上千个 URL。
- 会话与状态类:sid、sessionid、token、_t、timestamp 等,本来就不该出现在可分享的 URL 里。
二、核对顺序:从索引表现往回查
被收录的带参 URL,先看它长什么样,再顺着来源往回收。
- 在索引报表或 site 查询里抽样,看被收录的带参 URL 是否返回了完整正文,还是只是一个壳页。
- 检查站内链接:分享按钮、面包屑、分页条、筛选器是否把参数写进了 href。
- 检查 sitemap、RSS、AMP 或接口输出里是否直接提交了带参 URL。
- 看服务端对带参请求的响应:是 200 返回同一份正文,还是 302 跳到干净版本。
- 看 canonical 指向哪里,以及那个目标 URL 本身是否可正常抓取、是否已被收录。
参数收敛不等于“全部 Disallow”。robots.txt 屏蔽之后,已收录的 URL 常常仍会留在索引里,只是因为没有正文可读而显示成裸链接;同时爬虫读不到 canonical,归并信号也就传不过去。
三、按类型给处理方式
追踪类
- 内链一律使用无参版本,追踪参数由脚本在点击时拼接,而不是写死在 HTML 里。
- 带参版本尽量 canonical 到无参版本,两边正文保持一致。
筛选与排序类
- 只有确实有独立内容、也有搜索需求的筛选组合,才允许自指 canonical 并保持可抓取。
- 其余组合归并到主列表页;如果连归并都不合适,再用 noindex 处理,注意保留抓取权限。
会话与状态类
- 这类参数应回到服务端解决:生成会话标识时不要写进 URL,或对带参请求统一 302 到干净地址。
四、容易踩的坑
- 归并目标本身有问题:canonical 指到无参版本,但那个版本跳转、报错或内容不同,信号会被忽略。
- 站内链接自己带参数:等于不断把带参版本重新暴露给爬虫,清理速度赶不上发现速度。
- noindex 与 Disallow 同时用:屏蔽抓取后 noindex 读不到,页面可能长期停在索引里。
- 参数顺序不统一:?a=1&b=2 与 ?b=2&a=1 会被当成两个 URL,建议在服务端对参数排序做规范化。
- 大小写与空值参数:Color=Red 与 color=red、?size= 与不带 size,都可能各自成页。
五、处理后怎么确认
改完之后,按周观察索引报表中带参 URL 的数量趋势,同时抽查几个典型 URL 的抓取与索引状态。维护一份“允许索引的参数白名单”,后续新增筛选维度时先对照这份名单,避免同类问题反复出现。