NGINX反向代理下Web应用登出未发送Cookie问题
问题根源
你的配置中,add_header Set-Cookie $new_cookie;仅处理了SSO认证接口(/auth)返回的Cookie,但后端应用(http://127.0.0.1:8100)在登出时返回的Set-Cookie头未被NGINX转发给客户端。此外,若登出请求触发后SSO认证接口提前返回401,NGINX会直接跳转至登录页,导致后端应用的登出响应(含清除Cookie的头)无法到达客户端。
修复后的配置
server { location / { auth_request /auth; # 保留从SSO认证接口获取的Cookie,非空时才添加 auth_request_set $auth_cookie $sent_http_set_cookie; add_header Set-Cookie $auth_cookie always; # 显式转发后端应用的Set-Cookie头 proxy_pass_header Set-Cookie; # 传递客户端Cookie给后端,确保登出逻辑能识别会话 proxy_set_header Cookie $http_cookie; proxy_pass http://127.0.0.1:8100; } location /auth { internal; proxy_pass https://sso.sol/api/auth/check; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_set_header X-Original-URI $request_uri; } error_page 401 = @error401; location @error401 { # 修复URL拼写错误(原配置少了一个斜杠) return 302 https://sso.sol/auth/sign-in/?redirectURL=https://$host$request_uri; } }
关键修改说明
- 优化Cookie传递逻辑:将变量重命名为
$auth_cookie,给add_header加上always参数,确保在非2xx响应(如认证失败的401)中也能传递SSO返回的Cookie,且变量为空时不会添加无效头。 - 强制转发后端Cookie:添加
proxy_pass_header Set-Cookie;,明确要求NGINX转发后端应用返回的清除Cookie指令(默认虽会转发,但显式声明可避免其他配置干扰)。 - 传递客户端会话:添加
proxy_set_header Cookie $http_cookie;,确保后端应用能获取到客户端的会话Cookie,正确执行登出清除逻辑。 - 修复重定向URL错误:修正原配置中
https:/sso.sol的拼写问题,改为https://sso.sol,避免重定向失败。
验证步骤
- 检查后端应用登出接口的响应,确认包含
next-auth.session-token=; Max-Age=0; Path=/; HttpOnly; SameSite=Lax的Set-Cookie头。 - 测试登出操作时,通过浏览器开发者工具查看网络请求,确认NGINX转发的响应中包含该清除Cookie的头。
内容的提问来源于stack exchange,提问作者Lee Kai Xuan
相关产品推荐
相关产品推荐

