【ruoyi若依】Nginx配置优化:解决HTTPS/SSL启用后的首页重定向异常

1. 问题重现:HTTPS下的诡异重定向

最近在给一个基于ruoyi若依框架开发的后台管理系统部署上线,按照常规操作,我通过Nginx配置了SSL证书,启用了HTTPS。本以为一切顺利,结果在访问首页时遇到了一个让人有点懵的问题。

我的项目部署在 https://mydomain.com/myproject。当我满怀期待地在浏览器地址栏输入这个地址,敲下回车后,页面并没有如我所愿地展示登录界面,而是发生了一次重定向。浏览器的地址栏瞬间变成了 http://mydomain.com:443/myproject/。你能看出问题吗?没错,原本安全的 https 协议变成了不安全的 http,后面还莫名其妙地跟了一个 :443 端口号。443端口是HTTPS的默认端口,通常不会显式写在URL里,这下好了,它直接“抛头露面”了,而且整个URL变得不伦不类,页面自然也就无法正常访问了。

但有意思的是,如果我“手勤快一点”,直接在地址末尾加上一个斜杠 /,访问 https://mydomain.com/myproject/,页面却能正常加载。这就很奇怪了,为什么一个斜杠的差别,会导致完全不同的结果?这背后其实是Web服务器和应用框架在处理请求路径时一个很常见的约定:很多应用(包括Spring Boot,也就是ruoyi若依的底层)会将没有尾随斜杠的路径视为对一个“目录”的请求,并自动重定向到带斜杠的规范形式。这个机制本身没问题,问题出在这次重定向的过程中,协议和端口信息“跑偏”了。

我当时的开发环境是ruoyi 4.6.0,Spring Boot 2.3.4,用Nginx 1.18做反向代理。这个问题让我排查了好一阵子,因为它不是代码bug,也不是证书配置错误,而是反向代理环境下信息传递的“断档”。简单来说,用户通过HTTPS访问Nginx,Nginx再用HTTP协议(或者AJP等)将请求转发给后端的ruoyi应用。在重定向时,ruoyi应用只知道它自己收到的是HTTP请求,所以它生成的重定向地址自然也是 http:// 开头的,并且带上了它监听的服务器端口(如果应用配置了的话)。而Nginx作为“中间人”,没有把客户端原始的HTTPS协议信息正确地告诉后端应用,这才导致了这场“乌龙”。

2. 根因剖析:信息在传递中“丢失”了

要彻底解决这个问题,我们得先搞清楚请求从用户浏览器到后端应用,到底经历了什么,信息又是怎么“丢”的。我们来画一下这个链条(当然,是在脑子里画)。

第一步,用户在浏览器输入 https://mydomain.com/myproject 并访问。这是一个HTTPS请求,直接发给了Nginx服务器,因为我们的SSL证书是配在Nginx上的。

第二步,Nginx解密了这个HTTPS请求,然后它需要把请求内容转发给后台上真正运行ruoyi应用的服务(比如Tomcat,通常运行在8080端口)。为了效率和安全,Nginx通常会使用普通的HTTP协议来和后端通信。于是,Nginx构造了一个新的HTTP请求,发往 http://localhost:8080/myproject

关键点就在这里:对于后端的ruoyi应用(Spring Boot)来说,它接收到的请求信息就是:协议是HTTP,主机是localhost,端口是8080。它完全不知道最初的请求是HTTPS,也不知道用户访问的域名是 mydomain.com

第三步,ruoyi应用处理 /myproject 这个请求。根据其内部配置(可能是Spring MVC的机制,也可能是静态资源处理规则),它认为这是一个对目录的访问,需要规范化,于是决定发起一个302重定向,目标地址是 /myproject/

那么,它如何构造这个重定向的完整URL呢?它会基于自己收到的请求信息来拼装。也就是:协议(取自 request.getScheme())是 http,服务器名(取自 request.getServerName())是 localhost,端口(取自 request.getServerPort())是 8080。这样拼出来的地址就是 http://localhost:8080/myproject/。这显然不是我们想要的。

但实际情况比这稍好一点,因为Nginx在转发时,通常会设置一些特殊的HTTP头来传递原始客户端的信息,最主要的就是 X-Forwarded-Proto(传递原始协议)、X-Forwarded-Host(传递原始主机)、X-Forwarded-Port(传递原始端口)。如果ruoyi应用能识别这些头部信息,并用它们来覆盖 request 对象中的协议、主机和端口,那么它构造出的重定向地址就会是正确的 https://mydomain.com/myproject/

问题就出在,ruoy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值