问题描述
网站使用了nginx做反向代理,设置了所有http请求全部跳转为https。浏览器和nginx之间走的是https,nginx到tomcat走的是http。网站服务端使用的是springboot、springsecurity,认证授权使用的springsecurity。网站首页地址是/,登录页地址是/login。在首次打开网站地址https://aaa.com/时,框架拦截自动跳转至http://aaa.com/login(不是https//aaa.com/login),而nginx又配置了http自动跳转至https,这样导致的情况是,我本来访问的是https://aaa.com/,结果发起了3次请求:https://aaa.com/ —> http://aaa.com/login —> https://aaa.com/login。
解决办法
- 在nginx服务器中,加入
proxy_set_header X-Forwarded-Proto $scheme;
- 在项目yml文件中,加入
server:
tomcat:
remoteip:
protocol-header: X-Forwarded-Proto
原因分析
X-Forwarded-Proto(XFP)报头是用于识别协议(HTTP 或
HTTPS),其中使用的客户端连接到代理或负载平衡器一个事实上的标准报头。要确定客户端和负载均衡器之间使用的协议,X-Forwarded-Proto可以使用请求标头