Nginx集群Tomcat获取的域名地址为代理地址怎么办?

今天在部署项目时候,遇到这么一个问题。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


赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏