一、问题说明

过滤器在过滤登录请求的时候,对服务器的ip+端口号与访问请求的ip+端口号进行了校验。在没有使用nginx反向代理服务器的时候,可以校验成功的,但是在使用nginx反向代理之后,校验失败了。失败的错误图如下所示:

nginx域名带端口解决 nginx 端口_nginx

 这是我司系统部署给外省,他们在演示的时候出现的问题。下面解决的时候,ip和端口号我使用本地的来进行说明。

上图很明显是服务器的端口没有,我在本地debug调试查看,首先测试没有使用nginx反向代理的情况:

nginx域名带端口解决 nginx 端口_nginx_02

由上图可见通过request.getHeader()获取的是服务器的ip+端口号。request.getServerPort()获取的是本地服务器的端口号。(代码的那句“反向代理服务器端口”控制台打印就忽略吧,哈哈,之前调试的时候写的。)

然后测试使用nginx反向代理的情况:

nginx.conf的配置如下所示:

nginx域名带端口解决 nginx 端口_端口号_03

nginx域名带端口解决 nginx 端口_端口号_04

由上图可见,通过request.getHeader()获取的是服务器的ip,没有端口号了,emmm,一定是代理服务器设置的哪里出了问题。但是通过request.getServerPort()方法也是可以获取到反向代理服务器的端口号80的。

二、问题解决

后来查资料,发现了问题,修改如下:

nginx域名带端口解决 nginx 端口_80端口_05

 也就是在$host后面加上端口号。测试发现可以了,如下图:

nginx域名带端口解决 nginx 端口_nginx域名带端口解决_06

可以发现request.getServerPort()获取的端口号也变成了8080。咦~  不禁有个疑问nginx的端口不是80吗,咋request.getServerPort()怎么是8080端口了。

查资料发现,nginx的监听端口默认的80端口,如果nginx的监听端口不是默认的80端口,改为其他端口如81端口。

后端服务器中request.getServerPort()无法获得正确的端口,返回的仍然是80;正因为我指定了端口8080,所以返回的是8080端口了。来个小测试说明一下。来,我们用图说话:

nginx.conf配置:

nginx域名带端口解决 nginx 端口_80端口_07

debug调试:

nginx域名带端口解决 nginx 端口_nginx域名带端口解决_08


看到没有,获取的依旧是80端口号。

修改配置:

nginx域名带端口解决 nginx 端口_nginx域名带端口解决_09

 debug调试:

nginx域名带端口解决 nginx 端口_nginx域名带端口解决_10

三、总结

nginx.conf配置要通过request.getServerPort()获取指定的端口号,此时需要修改所访问请求的代理相关的配置:proxy_set_header Host $host:端口号;