今天在部署项目时候,遇到这么一个问题。Nginx集群Tomcat获取的域名地址为代理地址而不是实际请求的域名地址!
问题如下
Tomcat项目中运行的Java项目正常之后,放在nginx中做代理配置,代理配置如下
server { listen 80; server_name www.abc.com; autoindex off; location / { root D:/workSpaces/Server/apache-tomcat-8.0.39/webapps; index index.html index.jsp; proxy_pass http://localhost:8080; } } #server wx.youcl.com end}
Java项目中用到了如下代码获取域名地址
String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
假设我访问的域名为 www.abc.com,然后使用上面request获取的值是 http://localhost:8080,而不是实际的 www.abc.com
解决方法
查阅项目资料后发现,需要再配置一个重写代理header才可以,修改配置如下
server { listen 80; server_name www.abc.com; autoindex off; location / { root D:/workSpaces/Server/apache-tomcat-8.0.39/webapps; index index.html index.jsp; proxy_pass http://localhost:8080; #proxy_redirect http://localhost:8080 http://$host:$server_port; proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } #server wx.youcl.com end}
其中主要是 proxy_set_header Host $http_host;
这段语法,另外的 proxy_set_header X-Real-IP $remote_addr;
和 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
两个,适用于获取用户(客户端)IP地址,而不是代理的127.0.0.1,如果你在java代码中获取的地址为127.0.0.1,那么可能就是没有加上这两句话所引起的
proxy_set_header Host $http_host; # 将当前Host头域值填充成客户端地址 proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理路由信息,此处取ip有安全隐患 proxy_set_header X-Forwarded-Proto $scheme; # 真实用户访问协议 proxy_set_header X-Real-IP $remote_addr; # 真实用户IP