商城站内搜索支持按价格、销量、上新排序,地址变成 /search?q=耳机&sort=price,爬虫把每个关键词乘四种排序都抓了一遍,索引里多出六万条内容几乎相同的页面。

一开始怀疑是「列表页翻页又叠加 page 参数,组合数量再乘一层」,查了一圈,方向不对。

原因不止一个,得分开看。排序参数没有被 canonical 归一,每个组合都是独立地址。还有一种是搜索页模板没有 noindex,蜘蛛抓到就收。

还有一种情况,站内推荐模块把这些带参地址当内链输出。

动手时先统计带 sort 参数的抓取占比

grep -c 'sort=' access.log; grep -c 'sort=' access.log

给排序参数统一 canonical 到默认排序地址

curl -s 'https://www.example.com/search?q=earphone&sort=price' | grep -o '<link rel="canonical"[^>]*>'

搜索页响应头补 noindex

add_header X-Robots-Tag 'noindex, follow' always;

剩下的就是在 robots 里屏蔽排序参数

Disallow: /*?*sort=

恢复的判定其实很直接。带 sort 参数的地址统一返回 noindex 且 canonical 指向默认排序页,两周后索引里这类条目降到三位数,抓取日志里排序请求同步减少。

这里还有个坑。参数越多越要先做归一,靠 robots 拦只是止血,已经进索引的地址还得靠 noindex 和移除工具清理。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189