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

如果使用的是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;

但是如果使用了Nginx使用了HTTPS协议,但是反向代理时使用的是HTTP协议,那么上面的代码就不能获取到正确的协议。
Nginx还需要添加如下配置:

proxy_set_header	X-Forwarded-Proto	$scheme;

然后Tomcat的Engine下添加如下配置:

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

这样就能正确获取到协议信息了。

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

参考文章:http://feitianbenyue.iteye.com/blog/2056357

如果是Spring Boot内嵌的Tomcat可以配置:

server.tomcat.remote-ip-header=X-FORWARDED-FOR
server.tomcat.protocol-header=X-Forwarded-Proto
server.tomcat.port-header=X-Forwarded-Port
server.use-forward-headers=true