长连接下session/cookie跨请求丢失主因是代理链路中上下文截断或错配:一是cookie缺少samesite=none; secure属性被浏览器拦截;二是后端节点不固定致session分散,需ip_hash或sticky session绑定;三是cookie path与前端请求路径不匹配,须用proxy_cookie_path映射。

长连接状态下 Session 或 Cookie 跨请求丢失,不是连接没保持住,而是上下文在代理链路中被截断或错配。核心问题集中在三处:Cookie 属性不满足跨域携带条件、后端节点不固定导致 Session 分散、HTTP 头与路径重写未对齐。排查要从响应头、路由策略、路径映射三个层面逐项验证。
检查 Cookie 是否被浏览器静默丢弃
现代浏览器(Chrome 80+ 等)默认启用 SameSite=Lax,跨域请求下若响应 Cookie 缺少 SameSite=None; Secure,就会被拦截——即使 Nginx 转发了,前端也收不到。
- 用浏览器开发者工具 → Application → Cookies 查看登录后 Set-Cookie 响应头,确认是否含
SameSite=None; Secure(HTTPS 环境下必须) - Nginx 配置中需显式注入该属性:
proxy_cookie_path / "/; HttpOnly; Secure; SameSite=None";
或更精准(Nginx ≥1.19.3):proxy_cookie_flags ~ secure samesite=none; - 前端 fetch 请求必须带
credentials: 'include',否则浏览器根本不会发 Cookie
确认请求是否始终落到同一台后端
Cookie 正确送达后,若第一次登录打到 server-A,第二次请求轮询到 server-B,而 server-B 没有该 Session,照样登出。这不是 Cookie 问题,是会话粘性缺失。
- 在 upstream 块中启用
ip_hash;,最轻量的客户端 IP 绑定方案 - 若用户大量走 NAT(如企业内网),改用
hash $http_x_forwarded_for consistent;,但需确保上游代理可信并正确设置了 X-Forwarded-For - Nginx ≥1.29.6 可直接用原生 sticky sessions:
sticky cookie JSESSIONID expires=1h domain=.example.com path=/;,比 IP 更精准
核对路径重写与跳转头是否一致
Cookie Path 错配是高频隐形原因。比如后端返回 Set-Cookie: JSESSIONID=xxx; Path=/app/v2,但前端访问的是 /api,浏览器就不带这个 Cookie。
- 用
proxy_cookie_path /app/v2 /api;将后端 Cookie Path 映射为前端路径 - 后端重定向(如登录成功跳
Location: /dashboard)也要同步处理:proxy_redirect /dashboard /api/dashboard; - 确保
proxy_set_header Host $host;和X-Forwarded-For已设置,避免后端误判请求来源
验证跨域响应头是否合规
Access-Control-Allow-Origin 不能为 *,否则浏览器拒绝附带凭证(Cookie)。必须明确指定前端域名,且与前端 origin 完全一致。
- Nginx 中添加:
add_header 'Access-Control-Allow-Origin' 'https://your-fe-domain.com';add_header 'Access-Control-Allow-Credentials' 'true'; - 注意:这两个头必须同时存在,且 Origin 值不可动态生成(如用
$http_origin需严格白名单校验) - 若使用多个子域(如 fe1.example.com / fe2.example.com),可统一设为
https://*.example.com(需浏览器支持)











