在公司做的一个项目采用前后端分离的方式,前端用的是react,后端采用shiro来做权限控制和session管理,服务器上配置nginx使用8080作为监听端口。sessionID传递到前端保存在cookie中,请求后端接口时放在请求头中传到后台进行验证。
登录系统进行操作,一切很正常。但当我们重新发布时异常出现了:登录到系统的用户无法操作也不能跳转到登录页,经过分析后是因为服务器重启清空了session,而前端缓存的sessionID失效,shiro配置未登录跳转进行了重定向,由于nginx没有传递端口导致请求匹配不到报错。
图一,shiro配置:
图二,报错时nginx的配置:
图三,登录到系统的用户由于服务器重启,无法操作也不能跳转到登录页:
图四,分析请求发现端口丢失导致请求匹配不到报错:
图五,修改nginx配置,proxy_set_header 加入$server_port, 并且要对shiro未登录重定向的请求再次重定向:rewrite ^/pc/noLogin /zpzc_ms/pc/noLogin permanent;
图六,nginx配置修改后端口没有丢失,成功跳转到登录页面:
图七,重定向匹配nginx: