nginx反向代理session失效问题解决

问题场景

最近遇到一个做单点登录的需求,我准备简单做,也就是账号之间的互绑,比如A网站的账号关联上B网站的账号,登录了A网站之后再去B网站可以免登录,我是用nginx反向代理来解决的。

刚开始我是这么配置的:

location /aLogin {

​ proxy_pass http://a.com/aLogin;

}

通过浏览器访问http://a.com/aLogin时,浏览器的cookie内有jsessionid。再次访问时,浏览器会发送当前的cookie。

location /bLogin {

​ proxy_pass http://b.com/bLogin;

}

此时我们先回顾一下session的创建过程:

1、当浏览器第一次打开页面时,服务端会为这次会话创建一个session,并将session id通过response的header传递给浏览器,header一般为 Set-Cookie: JSESSIONID=xxxxx; Path=xxxx
2、浏览器接收到响应后,如果header Set-Cookie 中path的值与浏览器地址路径匹配,则将该header值存于浏览器的Cookie中
3、浏览器在下次请求服务器时,将Cookie中的JSESSIONID值通过request的header上报给服务端,header一般为 Cookie: JSESSIONID=xxxx;
4、服务端可通过该JSESSIONID来定位到对应的session

浏览器访问 http://a.com/aLogin 时,服务端返回的 Set-Cookie 的 Path 值为 /aLogin (因为中间有反向代理,服务端并不知道代理前的路径是啥,是按最终请求服务端的路径设置)

因为浏览器访问地址的路径 /bLogin 与 Set-Cookie的 Path/aLogin 不匹配,所以浏览器并不会将其值存入Cookie中。

因此在下次请求服务器时,浏览器无法设置request Cookie header的 JSESSIONID 值,服务器无法定位到对应的session,因此会将其当做第一次请求,创建一个新的session,如此反复,因此就算你登录认证通过了,但服务器返回的登录凭证(JSESSIONID)浏览器不会保存,并在下次请求时携带,导致服务器认为你是一个新的请求,当然就会又跳到登录页面了。

解决

nginx有一个命令 proxy_cookie_path(参考: proxy_cookie_path)可将服务器返回的 Set-Cookie 中的path进行修改,格式为 proxy_cookie_path 原路径 目标路径,我们在配置中添加 proxy_cookie_path 如下。

  1.  location /bLogin/ {
         proxy_pass  http://b.com/bLogin/;*
         proxy_cookie_path  /aLogin /bLogin;//注意此处的对应路径顺序
     }

重启nginx,结束

猜你喜欢

转载自blog.csdn.net/Attitude_do_it/article/details/121249224
今日推荐