`
litxuf
  • 浏览: 119431 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用apache 等反向代理后如何获得客户端的真实ip

阅读更多

    在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到 客户端的真实IP地址了。 

  这段时间在做IP统计的程序设计,由于服务器作了集群,使用了反向代理软件,将http://192.168.1.110:2046/的 URL反向代理为http://www.xxx.com/的URL时,用request.getRemoteAddr()方法获取的IP地址是: 127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。这是什么原因呢? 

  这是反向代理的原因。经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过 转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端 请求的服务器地址。当我们访问http://www.xxx.com/index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的 index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp,代理服务器再将访问到的结 果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方 法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。 


出来的结果:X-Forwarded-For: unknown 。X-Forwarded-For确实存在,但其值却为unknown,继续找原因。上网搜了搜,原因出在了Squid上。 

squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则: 

X-Forwarded-For: unknown 

一查,发现forwarded_for 项设为了off,原因找到了,把forwarded_for 项设为了on,重启后,访问http://www.xxx.com/index.jsp/ 获得的IP是客户端的真实IP。 
       

String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;

 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢? 

  答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 

  如: 
  X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100 
  用户真实IP为: 192.168.1.110

 

参考 http://blog.csdn.net/qianhoubing/archive/2008/03/19/2196342.aspx

分享到:
评论

相关推荐

    Nginx作为反向代理时传递客户端IP的设置方法

    因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。 同样适用于前端是 Squid 或者...

    Java正确获取客户端真实IP方法整理.docx

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:2046/的URL反向代理为http://www.abc.com/的URL时,用request.getRemoteAddr()方法...

    Java获取客户端IP及Mac地址(同网段).rar

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。所以...

    java获得客户端真实的ip地址

    但是在通过了apache,squid等反向代理软件就不能获取到客户端的真实ip地址了。如果使用了反向代理软件,用request.getremoteaddr()方法获取的ip地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实ip。

    获取客户端IP

    在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是:request....但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了

    JSP如何获取客户端真实IP地址

    这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将http://192.168.1.110:3306/ 的URL反向代理为http://www.8888.com/ 的...

    Java获取客户端IP

    但是在通过了Apache,Squid等反向代理软件不能获取到客户端的真实IP地址了。  原因:由于在客户端和服务之间增加了中间代理,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给...

    Java获取客户端的真实IP地址

    但是在通过了Apache,Squid等反向代理软件不能获取到客户端的真实IP地址了。像移动网关一样,iisforward这个ISAPI过滤器也会对request对象进行再包装,附加一些WLS要用的头信息。这种情况下,直接用request....

    JSP 获取真实IP地址的代码

    但是在通过了 Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP。 ...

    org.apache.commons.lang3.StringUtils.jar

    java获取客户端ip(经过多次代理)提示StringUtils cannot be resolved 需要先 import org.apache.commons.lang3.StringUtils; /* 内含 common-lang3.jar commons-lang3-3.9-bin.zip commons-lang3-3.9-src.zip ...

    运维-Nginx代理服务器-方向代理-负载均衡-数据缓存

    我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。...

    用Java来获取访问者真实的IP地址

    但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。

    JSP 获取用户的真实IP两种实现方法详解

    但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP。  ...

    搭建代理服务器.docx

    代理服务器的优点: 能够缓存增加访问速度 提供使用私有IP访问internet的访问 提高了网络的安全性 方便对用户的管理 代理方式: 普通代理:客户端主机必须在自己的浏览器里指定代理服务器的IP地址和代理服务器监听...

    Java中使用HttpRequest获取用户真实IP地址

    主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache、Squid、nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下

    java获取ip地址示例

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了

    mod_log_ipmask:Apache模块,用于从请求数据中删除IP地址(或其中的一部分)

    通过此Apache模块,您可以在将客户端IP地址的一部分写入AccessLog或CustomLog类的日志文件之前,对其进行AccessLog 。 可以修改mod_log_config提供的%a和%h占位符,例如, %{16}a将仅使用远程IP地址的前16位(两个...

    node-apache-log:和node.js实用程序来监视apache服务器日志。 监视日志文件并将更改打印到控制台。 还反向地址解析的IP地址

    节点日志 这是一个命令行工具(通常),用于一次监视大量的apache虚拟主机 ... 反向地理编码的位置数据(来自ip)也显示在终端中。 但是,在第一次访问客户的请求中,请求释放地理信息以获取位置数据,直

    TCP/IP技术大全

    26.2.2 使用FTP客户端建立连接 288 26.2.3 FTP安全 296 26.2.4 FTP服务器及守护进程 299 26.2.5 匿名FTP访问 299 26.3 使用TFTP 300 26.3.1 FTP与TFTP的区别 301 26.3.2 TFTP命令 301 26.4 小结 301 第27章 使用...

Global site tag (gtag.js) - Google Analytics