报错是这么冒出来的。站点在 URL 里附加了 jsessionid 参数,canonical 直接取当前地址生成,同一个页面每次抓到的 canonical 都不同,索引报告里重复网页数量持续上涨。

中间走过弯路,把「缓存层把带 session 的版本单独缓存,形成了多个副本」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。canonical 用 request_uri 拼接,把会话参数一起带了进去。也可能是应用没有对 session id 做 URL 重写,参数留在了地址里。

少数情况下是内部链接也没有剔除会话参数,蜘蛛跟着传播。

先抽样看 canonical 是否带参数

curl -s 'https://www.example.com/a/1.html;jsessionid=abc' | grep -o '<link rel="canonical"[^>]*>'

然后检查响应头里是否设置了 cookie 路径

curl -sI https://www.example.com/a/1.html | grep -i set-cookie

生成 canonical 时只取路径部分

add_filter('get_canonical_url', fn($u) => strtok($u, ';'));

等前面都确认过,再在容器里开启 URL 重写去掉会话标识

<session-config><tracking-mode>COOKIE</tracking-mode></session-config>

别只看报错消失,验证要多做一步。canonical 不再随会话变化,重复网页报告里的同类条目两周内清零。

这里还有个坑。会话参数进 URL 是 Java 站的老问题,canonical 必须按路径生成,不能拿完整请求地址直接拼。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189