报错是这么冒出来的。RSS 模板复用了分享链接的生成函数,每篇文章的 link 后面都带 ?utm_source=rss&utm_medium=feed。十几个采集站原样转载,带参地址在外部被大量引用,收录里同一篇文章出现两条,权重被拆开。

中间走过弯路,把「页面没有对 utm 参数做 canonical 收口,两条地址都能独立成立」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。feed 模板复用了分享用的链接函数,把跟踪参数写进了正文链接。另一种情况是采集站不做参数清理,原样发布带参地址。

还有一种情况,CDN 按完整地址缓存,带参版本各存了一份。

上来先看 feed 里输出的是什么地址

curl -s https://www.example.com/feed | grep -o '<link>[^<]*' | head

然后把 feed 的 link 改成不带参数的永久地址

grep -rn 'utm_source' feed/template.xml

再往下确认页面 canonical 是否忽略参数

curl -s 'https://www.example.com/p/1024?utm_source=rss' | grep -o 'rel="canonical"[^>]*'

末了对外部带参地址做一次统计,评估清理范围

awk '$7~/utm_source/{print $7}' access.log | wc -l

别只看报错消失,验证要多做一步。feed 里的地址变干净,带参版本的收录逐步合并回主地址,重复页面的数量停止增长。

提醒一点。跟踪参数本身没错,错在把它写进了给机器读的 feed,人点的链接加参数,机器读的链接要干净。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189