这篇文章主要为大家展示了nginx反向代理导致会话失效怎么办,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
一同事求援:后台系统的登录成功了,但不能成功登进系统,仍然跳转到登录页,但同一套代码另一个环境却没有问题。
经了解,他对同一个项目使用tomcat部署了两个环境,一个在开发服务器上,一个在他本机,两个环境代码配置完全相同。两边通过同一个nginx进行反向代理,nginx配置大致如下,
位置/健康/{ proxy_pass http://192.168.40.159:8081/健康/;#无问题的配置 } 位置/health-dev/{ proxy_pass http://192.168.40.202:8080/健康/;#有问题的配置 }
一个反向代理到开发环境,一个反向代理到本机服务。
既然代码配置完全相同,那么问题很大可能就出现在nginx的反向代理上。
因为两边位置路径不同(即浏览器路径不同),但是反向代理的服务端路径却相同,结合会话的基本原理,如下图,
- <李>当浏览器第一次打开页面时,服务端会为这次会话创建一个会话,并将会话id通过回应的头传递给浏览器,头一般为set - cookie: JSESSIONID=xxxxx;李路径=xxxx李> <>浏览器接收到响应后,如果头set - Cookie中路径的值与浏览器地址路径匹配,则将该标题值存于浏览器的Cookie中李> <李>浏览器在下次请求服务器时,将饼干中的JSESSIONID值通过请求的标题上报给服务端,头一般为饼干:JSESSIONID=xxxx; 李> <李>服务端可通过该JSESSIONID来定位到对应的会话
李,>
nginx反向代理按这种方式配置时
位置/health-dev/{ proxy_pass http://192.168.40.202:8080/健康/; }
浏览器访问http://www.domian.com/health-dev <代码> 代码>时,服务端返回的<代码> set - Cookie> 代码的路径值为<代码>/健康> 代码(因为中间有反向代理,服务端并不知道代理前的路径是啥,是按最终请求服务端的路径设置),如图
因为浏览器访问地址的路径<代码>/health-dev 代码>与<代码> set - Cookie> 代码的路径<代码>/健康> 代码不匹配,所以浏览器并不会将其值存入饼干中,如图
因此在下次请求服务器时,浏览器无法设置请求<代码>饼干代码>头的<代码> JSESSIONID> 代码值,服务器无法定位到对应的会话,因此会将其当做第一次请求,创建一个新的会话,如此反复,因此就算你登录认证通过了,但服务器返回的登录凭证(JSESSIONID)浏览器不会保存,并在下次请求时携带,导致服务器认为你是一个新的请求,当然就会又跳到登录页面了。
nginx有一个命令<代码> proxy_cookie_path> 代码(参考:proxy_cookie_path)可将服务器返回的<代码> set - Cookie> 代码中的路径进行修改,格式为<代码> proxy_cookie_path原路径目标路径> 代码,我们在配置中添加<代码> proxy_cookie_path> 代码如下。
位置/health-dev/{ proxy_pass http://192.168.40.202:8080/健康/; proxy_cookie_path/健康/health-dev; }
重启nginx,问题解决。
以上就是关于nginx反向代理导致会话失效怎么办的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看的到。