Nginx 反向代理下拿到客户端的真实IP
前段时间在做AOP的Log记录的时候需要拿到用户的真实ip 然后一直拿不到用户的真实ip 拿到的一直是Nginx 上的ip地址 才知道在Nginx 经过反向代理后是拿不到真实的ip地址的 在没有经过Nginx 反向代理 之前 直接使用 request.getRemoteAddr() 拿到客户端的真实ip在大多情况都是Ok 的
但是现在有了反向代理后 就需要对code 做一些处理 都知道Nginx 是一个转发代理服务器的中间件 所以服务器无法直接拿到客户端的ip服务器端应用也无法直接通过转发请求的地址返回给客户端。也就是当我们在访问xx.jsp/时,其实并不是我们浏览器真正访问到了服务器上的xx.jsp 文件,而是先由代理服务器去访问xx.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问xx.jsp的,所以xx.jsp中通过 request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
在经过强大的百度后原来在转发请求的HTTP头部信息中 增加了X-FORWARDED-FOR信息。用以跟踪 原有的客户端IP地址和原来客户端请求的服务器地址。
那就可以得到客户端的真实ip
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
这也是一种方法
第二种方法就是
当在经过多级的反向代理后 X-FORWARDED-FOR 的值不只一个而是一串ip 值
这时候也不去确定那个是有效的ip 可以直接取X-FORWARDED-FOR中第一个非unknown 的有效Ip字符串
这样就行了
然后在修改写Nginx 的Nginx.conf 配置文件
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
把这些加进去就可以