现场是这样的。日志里蜘蛛抓的地址是 /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,就等于给每个访客生成一条新地址,这是重复内容里最容易被忽略的一种。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
