这个坑值得记一笔。列表页有 sort 和 order 这类排序参数,百度 Clean-param 里也写了,抓取统计里这类地址每天仍被请求 3 万次,日志里参数顺序还各不相同。

刚开始盯着「参数顺序不同被当成不同 URL,规则只匹配固定顺序」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。Clean-param 只对百度生效,且必须写成 robots.txt 里的独立行;规则里只列了 sort 和 order,orderby 与 paged 没写进去;指令被写进 User-agent 分组内,百度没有读到。

上来先看 robots 里 Clean-param 的写法

curl -s https://www.example.com/robots.txt | grep -i clean-param

随后统计实际出现的参数组合

awk '{print $7}' access.log | grep -o 'sort=[a-z]*' | sort | uniq -c

然后把漏掉的参数补进同一行

Clean-param: sort&order&orderby&paged /list/

末了观察蜘蛛请求量变化

grep -c 'sort=' /var/log/nginx/access.log

改完先别撤,确认这几项。Clean-param 行被百度正确读取,排序参数请求量一周内降到千次以内,列表页收录集中到规范地址。

容易忽略的是,Clean-param 只影响百度的抓取判断,Google 侧还得靠 canonical 和参数处理,两边要各配一套。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189