nginx反代java/web程序request.getServerPort()获取端口号不正确的处理

2023-07-23 252点热度 0人点赞 0条评论

在JSP里,获取web base来加载静态资源:

if (request.getServerPort() == 80 || request.getServerPort() == 443) {
    return request.getScheme() + "://" + request.getServerName() + request.getContextPath();
} else {
    return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

以上代码来获取网站的基路径,如果要加载静态资源,直接基于上面的路径。

例如JSP里这样写:

<%
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
%>

<base href="<%=basePath%>">

不过有个问题,在应用前面加了一个nginx反向代理后,获取到的端口就不正确了:request.getServerPort() 得到的端口,不是nginx对外的端口。

原因和应对

主要原因在Nginx的配置文件的host配置时没有设置响应的端口。

nginx一般反带的配置如下:

location / {
    proxy_pass http://127.0.0.1:8082;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

proxy_set_header Host $host; Host 配置的只有 host, 没有对应的 port, 导致获得的serverPort混乱。

改成如下即可($host:$server_port):

location / {
    proxy_pass http://127.0.0.1:8082;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

或者直接指定端口(这里我的nginx开的是17004端口,直接指定17004端口就可以了):

location / {
    proxy_pass http://127.0.0.1:8082;
    proxy_set_header Host $host:17004;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

 

 

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论