Nginx请求转发端口、请求头丢失
一个老项目需要整合SSO,我们公司的SSO需要拦截请求地址,该路径下的所有请求必须先登录,当登录后通过Http Header传递用户信息,这里面先是通过apache->nginx->tomcat。
请求头丢失
其它业务都正常,这个业务的后端无论如何都获取不到apache发送过来的请求头,然后,我们就去掉nginx这个环境,发现tomcat能正常获取到相应的值,这时候,我们断定是nginx代理的问题,那么为什么部分请求头会丢失,部分请求头又可以正常传递呢?通过观察发现,丢失的请求头都是包含有_
的,后面通过查资料发现,nginx默认会把header中带_
的参数给过滤掉。要解决这个问题又两个方法:
- 把
_
改为-
或者不要_
.
2.在nginx的http
模块中设置underscores_in_headers on;
端口丢失
一切都比较正常,SSO能够登陆成功,可是在跳转时,端口有丢失了。这个需要在location
模块中配置端口的转发
1 | location /{ |
根目录重定向
我们这边有时候会超时,但是SSO这边还未超时,那么就会涉及到重新登录的问题,这里我采用的方式是,业务程序里面如果Redis中的session过期,那么就重定向到页面根目录,然后通过Nginx再重定向到自动登录页面,
1 | location =/{ |
这里是完全匹配,如果是根目录,就重定向到ssologin
,如果此时SSO未过期,那么Apache会放行,业务系统重定向登录一次,如果SSO过期,那么Apache会拦截跳转到SSO登录页面,当然,其实为了方便,可以在程序拦截器中直接重定向到ssologin
,但是有时候,超级管理员不想通过SSO登录,直接从业务系统后台登录,后台登录就直接访问tomcat,不走Nginx。
Nginx请求转发端口、请求头丢失