前言
我们有个项目使用 Spring Boot 开发, 使用 Nginx 做反向代理并配置了 SSL,但是后端重定向一直重定向 Http 协议而非 Https 协议,导致网页无法打开。
解决方案
原因是用 Ninx 反向代理 Tomcat,然后把 Nginx 配置为 Https 访问,并且 Nginx 与 Tomcat 之间配置为普通的 Http 协议,当后台代码定义时 redirect,实际是重定向到了 Http 下的地址,导致浏览器上无法访问非 Https 的地址。
由于对 Tomcat 而言收到的是普通的 Http 请求,因此当 Tomcat 里的应用发生转向请求时将转向为 Http 而非 Https,为此我们需要告诉 Tomcat 已被 Https 代理,方法是增加 X-Forwared-Proto
。
在 Nginx 中添加配置
1
proxy_set_header X-Forwarded-Proto $scheme;
比如
1
2
3
4location /api/ {
proxy_pass http://server;
proxy_set_header X-Forwarded-Proto $scheme;
}在 application.properties 添加配置
1
2server.use-forward-headers=true
server.tomcat.protocol-header=X-Forwarded-Proto
当然还有其他方法,比如 Tomcat 重定向 Https 请求变为 Http。其实和这个大同小异,但需要修改源码,详见tomcat重定向https请求变为http。