Nginx 把 Tomcat 子应用代理到根路径后,会话每次重建
从 Set-Cookie 和后续请求定位 Cookie Path 不匹配,在独立域名内精确改写已确认的路径,并检查同名 Cookie 冲突。
把 Tomcat 的 /app1/ 通过 Nginx 映射到独立域名的根路径后,页面能打开,登录状态却保不住,连续请求反复得到新的 JSESSIONID。直连带 /app1/ 的地址正常时,可以检查响应 Cookie 是否还带着 Path=/app1。
浏览器访问的是 /account,这个路径不属于 /app1。即使浏览器保存了 Cookie,也不会因为 Nginx 在内部添加了 /app1/ 就把它发送出去。本文限定这一已经证实的路径不匹配;收到 Cookie 后仍丢会话、跨站策略阻止 Cookie、后端多节点会话不共享,需要分别处理。
对照响应与下一次请求
在测试账户的浏览器开发者工具中保留网络请求,观察一次建立会话的响应,以及随后访问应用页面的请求。下面只展示属性结构,Cookie 值是占位符:
浏览器请求:https://app.example.com/
后端处理路径:/app1/
响应:Set-Cookie: JSESSIONID=REDACTED; Path=/app1; Secure; HttpOnly
随后浏览器请求:https://app.example.com/account
检查最后一个请求有没有发送预期的 JSESSIONID。同时查看 Cookie 存储中的 Domain、Path 和浏览器给出的阻止原因,不要仅凭“响应有 Set-Cookie”认定会话已建立。Cookie 路径匹配发生在浏览器看到的 URL 上;/app1 能匹配 /app1、/app1/account,不能匹配 /account 或 /app10。
如果请求已经带上正确 Cookie,而应用仍创建新会话,就不能继续归因于这个 Path。也不要把登录时为防止会话固定而正常更换标识,误判为每次请求丢会话。排查记录中遮盖 Cookie 值,避免把登录凭据贴进工单或访问日志。
只改已确认的 Cookie 路径
应用若支持设置对外会话 Cookie 路径,可以先让它正确生成 Path=/。无法在应用侧调整时,Nginx 1.1.15 起可用 proxy_cookie_path 修改代理响应中的 Path 属性。
下面假设整个 app.example.com 专用于这个应用,现有普通前缀代理把公开根路径映射到后端 /app1/,且已经确认 Cookie 的 Path 恰好为 /app1:
location / {
proxy_pass http://127.0.0.1:8080/app1/;
proxy_cookie_path ~^/app1$ /;
}
实际改动是在已有对应块中增加第二条指令;保留原有认证、限流、请求头及其他设置。后端地址只是示例,Nginx 在容器内时应使用其实际可达地址。不要为修 Cookie 顺便改变已经工作的 proxy_pass URI。
正则的首尾锚点限定了完整属性值。如果实际收到 Path=/app1/,应依据该值使用 ~^/app1/$;不要把所有路径都无条件改成 /。同一级有多条可匹配的 proxy_cookie_path 时,第一条匹配规则生效,还需检查继承的规则,避免新增指令被前面的规则抢先处理。
这条指令处理 Path,不会替你修正错误的 Domain,也不会删除 Secure、HttpOnly 或 SameSite。不要通过去掉安全属性来掩盖路径问题。
根路径会扩大 Cookie 的发送范围
从 /app1 改为 / 后,该 Cookie 会覆盖这个域名的全部路径。若同一域名还挂了其他应用,特别是也使用 JSESSIONID,扩大范围可能让请求同时携带多个同名 Cookie。此时应先调整应用的独立域名、Cookie 名称或明确的路径布局,不要套用根路径方案。Cookie Path 本身也不能作为应用间可靠的安全隔离。
加载与回退都要检查会话
修改前备份目标配置到不会被 include 加载的位置,在对应部署的本地配置上检查语法:
nginx -t -c /etc/nginx/nginx.conf
配置路径及运行前缀须与实例一致。检查通过后按原部署流程加载;直接管理的实例可在确认 master 和配置一致后使用:
nginx -s reload -c /etc/nginx/nginx.conf
重新建立测试会话,核对公开响应已是预期 Path,后续 /account 请求确实带回 Cookie,应用维持相应登录状态,再检查退出和其他路径。修改服务器配置不会自动删除浏览器里先前保存的同名、不同 Path Cookie;需要时仅清理测试账户在该站点的相关 Cookie 后重试,不批量清理用户会话。
发生冲突时恢复本次 Path 改写及配套应用设置,重新检查并加载。浏览器中的旧 Cookie 可能继续存在,回退验收也要同时核对属性和请求,不能只看配置文件已恢复。


