事情本身不复杂,线索都在日志里。首页 banner 和推荐文章的内链都带 utm_source=home,日志里同一篇文章既有干净地址也有带参地址。canonical 指向干净版,但带参版仍被反复抓取。

第一反应是「canonical 只能提示合并,不能阻止蜘蛛抓取带参地址」,验证下来不成立。

原因不止一个,得分开看。带查询参数的地址是独立 URL,抓取和缓存都分开算。还有一种是内链模板把渠道参数写死,全站入口都带。

还有一种情况,CDN 按完整 URL 缓存,同一页面存了两份。

先统计带参地址的抓取量

grep -c 'utm_source=home' /var/log/nginx/access.log

再往下清掉模板里的渠道参数

grep -rn 'utm_source=home' /var/www/html/wp-content/themes/ | wc -l

接着在边缘把参数跳回干净地址

if ($arg_utm_source) { return 301 https://$host$uri; }

复核页面里的内链

curl -s https://www.example.com/ | grep -o 'href="[^"]*utm_[^"]*"' | head

改完先别撤,确认这几项。内链去掉参数后,带参请求占比从三成降到不足百分之一,同一批文章的抓取次数下降,缓存命中率上升。

渠道统计用事件或日志分析,不要写进链接,站内每多一种参数就多一份重复 URL。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189