现场是这样的。日志里蜘蛛抓的地址是 /list/;jsessionid=8F3A2C 这种形式,同一个页面每天出现几十个不同后缀,索引里一条都没收。

中间走过弯路,把「站点对没有 cookie 的请求一律新建会话」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。后端用 URL 重写传递会话,cookie 不可用时自动追加 session id;负载均衡的健康检查没带 cookie,触发了一次重写;内链生成时直接拼了当前请求的完整地址。

第一件事是统计带 session id 的请求占比

awk '$7 ~ /jsessionid/{s++} END{print s, NR}' access.log

然后关掉 URL 重写只保留 cookie

context.xml 里设置 tracking-mode=COOKIE

接着用 301 去掉地址里的会话参数

rewrite ^(.*);jsessionid=[^?]*$ $1 permanent;

剩下的就是加一条 canonical 兜底

curl -s https://www.example.com/list/ | grep -o 'rel="canonical"[^>]*'

别只看报错消失,验证要多做一步。关闭 URL 重写并补了清理规则后,带会话后缀的请求归零,列表页在一周内被正常收录。

容易忽略的是,会话参数一旦进 URL,就等于给每个访客生成一条新地址,这是重复内容里最容易被忽略的一种。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189