问题出现得很突然,日志倒是留得挺全。老 Java 站升级 Tomcat 10 后 容器在客户端禁用 Cookie 时把 jsessionid 拼进 URL 蜘蛛不带 Cookie 每次都被当成新会话 同一篇文章生成几十条 /p/123;jsessionid=AB12CD 的地址 索引里出现大量带分号的重复页
刚开始盯着「前置 Nginx 没剥掉路径里的分号参数」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。应用用 response.encodeURL 输出链接 Cookie 不可用时自动带 session id。另一种情况是蜘蛛不带 Cookie 每次都触发 URL 重写。
不容易想到的是,sitemap 生成时取了当前请求地址 把 session 一起写进去。
上来先确认日志里带分号的请求占比
grep -c 'jsessionid' access.log
接着在 Nginx 层剥掉路径参数
if ($request_uri ~ ';(jsessionid=[^?]*)') { return 301 $uri; }
随后关闭容器 URL 重写
sed -i 's/URLRewrite/URLRewriteDisabled/' context.xml
等前面都确认过,再确认 sitemap 里输出的是干净地址
curl -s https://www.example.com/sitemap.xml | grep -c 'jsessionid'
改完先别撤,确认这几项。带分号的地址全部 301 到干净路径 日志里 jsessionid 请求降到零 索引里重复页随抓取自然消失。
补一句。会话跟踪放 Cookie 就够了 一旦落进 URL 就等于给每个访客发一个独立网址。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
