Nginx请求转发端⼝、请求头丢失
⼀个⽼项⽬需要整合SSO,我们公司的SSO需要拦截请求地址,该路径下的所有请求必须先登录,当登录后通过Http Header传递⽤户信息,这⾥⾯先是通过apache->nginx->tomcat。
请求头丢失
其它业务都正常,这个业务的后端⽆论如何都获取不到apache发送过来的请求头,然后,我们就去掉nginx这个环境,发现tomcat能正常获取到相应的值,这时候,我们断定是nginx代理的问题,那么为什么部分请求头会丢失,部分请求头⼜可以正常传递呢?通过观察发现,丢失的请求头都是包含有_的,后⾯通过查资料发现,nginx默认会把header中带_的参数给过滤掉。要解决这个问题⼜两个⽅法:
1.把_改为-或者不要_.
2.在nginx的http模块中设置underscores_in_headers on;
nginx和apache区别端⼝丢失
⼀切都⽐较正常,SSO能够登陆成功,可是在跳转时,端⼝有丢失了。这个需要在location模块中配置端⼝的转发
location /{
proxy_set_header Host $http_host;
}
根⽬录重定向
我们这边有时候会超时,但是SSO这边还未超时,那么就会涉及到重新登录的问题,这⾥我采⽤的⽅式是,业务程序⾥⾯如果Redis中的session过期,那么就重定向到页⾯根⽬录,然后通过Nginx再重定向到⾃动登录页⾯,
location =/{
rewrite ^/ /ssologin;
}
这⾥是完全匹配,如果是根⽬录,就重定向到ssologin,如果此时SSO未过期,那么Apache会放⾏,业务系统重定向登录⼀次,如果SSO过期,那么Apache会拦截跳转到SSO登录页⾯,当然,其实为了
⽅便,可以在程序中直接重定向到ssologin,但是有时候,超级管理员不想通过SSO登录,直接从业务系统后台登录,后台登录就直接访问tomcat,不⾛Nginx。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论