通过 proxy_cookie_path 修改后端返回的 cookie path 为用户实际访问路径前缀,使浏览器正确发送会话 cookie;需配合 proxy_redirect、rewrite 和 proxy_set_header 确保跳转与请求上下文一致。

直接在 location 块里用 proxy_cookie_path 把后端返回的 Cookie Path 改成用户实际访问的路径,就能让浏览器正确发送会话 Cookie。关键不是加功能,而是让浏览器觉得“这个 Cookie 确实该发给我”。
先确认是不是 Path 不匹配导致的丢失
打开浏览器开发者工具 → Application → Cookies,找到你的会话 Cookie(比如 JSESSIONID 或 sessionid),看它的 Path 值。再对比你当前 URL 的路径,例如访问的是 https://example.com/app1/dashboard,而 Cookie 的 Path 是 / 或 /api 或 /app2/,只要不是当前 URL 路径的前缀,浏览器就会拒绝携带——这就是典型原因。
- Path=/ 对应 /app1/ ❌(现代浏览器常拒发,尤其启用了 SameSite=Lax/Strict)
- Path=/app2/ 对应 /app1/ ❌(不构成前缀关系)
- Path=/app1/ 对应 /app1/dashboard ✅
基础写法:按固定路径映射
假设你把后端服务部署在 /app1/ 下,但后端自己生成的 Cookie Path 是 /,那就需要补上前缀:
location /app1/ {proxy_pass http://backend/;proxy_cookie_path / "/app1/";}
如果后端返回的是 Path=/admin,而你代理到 /app1/admin,就写:proxy_cookie_path /admin "/app1/admin";
进阶写法:用正则应对多版本或动态路径
当后端路径带版本号(如 /v1/user、/v2/order),你想统一收口到 /app1/ 下,可用正则捕获:
proxy_cookie_path ~^/(v\d+)/(.*)$ "/app1/$1/$2";-
proxy_cookie_path ~^/(.*)$ "/app1/$1";(慎用,要确保 $1 不为空,否则可能生成/app1//)
注意:正则开头必须加 ~,且只匹配 Set-Cookie 头中完整的 Path=xxx 值,不是请求路径。
单改 Path 不够,还得同步处理跳转和请求上下文
Cookie 路径对了,但后端返回 Location: /dashboard,浏览器跳过去后地址变成根路径,又不带 Cookie 了。得配齐三件套:
- 用
proxy_redirect / /app1/;把响应头里的跳转地址重写为前端路径 - 用
rewrite ^/app1/(.*)$ /$1 break;把客户端请求路径剥离,让后端收到干净路径 - 加
proxy_set_header X-Forwarded-Prefix /app1;,方便后端拼接资源链接或 API 地址
这些指令都要和 proxy_cookie_path 在同一个 location 块里,且 proxy_cookie_path 必须紧接在 proxy_pass 后面,顺序错了就不生效。











