在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; }
文章评论