Nginx+Tomcat正确获取客户端请求地址

Nginx+Tomcat正确获取客户端请求地址

2022年01月16日 @ sffu

一、Nginx配置

1、如果使用的是HTTP协议,直接使用如下配置,即可获取到客户端请求地址和IP信息:

proxy_set_header	Host			    $host;
proxy_set_header	X-Real-IP		    $remote_addr;
proxy_set_header	X-Forwarded-For		$proxy_add_x_forwarded_for;

2、但是如果使用了Nginx使用了HTTPS协议,但是反向代理时使用的是HTTP协议,那么上面的代码就不能获取到正确的协议,如下设置:

proxy_set_header	X-Forwarded-Proto	$scheme;
# 设置代理的协议头 https,与tomcat中的配置(protocolHeader="x-forwarded-proto")配合使用,tomcat 需要添加的配置见后面

3、如果想获取客户端请求端口号,如下设置:

proxy_set_header    X-Forwarded-port    $server_port;
# 设置代理的端口,与tomcat中配置(portHeader="x-forwarded-port")配合使用,因为在代码中想要使用request.getServerPort() 获取到8888,如果不配此项导致获取到的端口为443(https默认的端口),同时request.getRequestURL() 获取到url地址可能是不含有端口的

这里还需要说明一点,上面配置均需要配置到location中方能有效,配置在server模块内是无效的。

二、Tomcat配置

1、Tomcat的Engine下添加如下配置:

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
       remoteIpHeader="X-Forwarded-For" 
       protocolHeader="X-Forwarded-Proto" 
       protocolHeaderHttpsValue="https"
       port-header="X-Forwarded-Port"/>

2、如果是SpringBoot内嵌的Tomcat可以配置:

server:
  tomcat:
    remote-ip-header: X-Forwarded-For
    protocol-header: X-Forwarded-Proto
    protocol-header-https-value: https
    port-header: X-Forwarded-Port

最后更新于