在开发网站时,为了统计访客数和访问量,经常需要统计网站访问者的 IP 地址。

1. 解决方法

获取客户端的 IP 地址有以下几种:

  • REMOTE_ADDR :客户端跟服务器 握手 时的 IP ,如果使用了 匿名代理,则显示代理服务器的 IP
  • HTTP_CLIENT_IP :代理服务器发送的 Http 头,如果是 超级匿名代理,则返回 none 值,同样, REMOTE_ADDR 也会被替换成这个代理服务器的 IP
  • HTTP_X_FORWARDED_FOR:用户是在哪个IP 使用的代理。

2. 不同情况下的区别

2.1 没有使用代理服务器

  • REMOTE_ADDR :客户端 IP
  • HTTP_X_FORWARDED_FOR :没数值或不显示

2.2 使用透明代理

  • REMOTE_ADDR :最后一个代理服务器 IP
  • HTTP_X_FORWARDED_FOR :客户端真实 IP

这类代理还会将客户真实 IP 发送到请求对象,无法隐藏真实 IP

2.3 使用普通匿名代理服务器

  • REMOTE_ADDR :最后一个代理服务器 IP
  • HTTP_X_FORWARDED_FOR :代理服务器 IP

这类代理隐藏了客户端的真实 IP ,但服务器会知道客户端是通过代理服务器去访问的。

2.4 使用欺骗性代理服务器

  • REMOTE_ADDR :代理服务器 IP
  • HTTP_X_FORWARDED_FOR :随机的 IP

服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假 IP

2.5使用高匿名代理

  • REMOTE_ADDR :代理服务器 IP
  • HTTP_X_FORWARDED_FOR :没数值或不显示

使用这种代理时,不同浏览器不同设备会返回不同的 IP 头信息,因此可能获得是 空值unknown 值。

3. 示例代码

一般来讲,获取客户端 IP,会先取 HTTP_CLIENT_IP 的值,其次拿 HTTP_X_FORWARDED_FOR,最后是 REMOTE_ADDR

<?php
    if(getenv('HTTP_CLIENT_IP')) {
        $onlineip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
        $onlineip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR')) {
        $onlineip = getenv('REMOTE_ADDR');
    } else {
        $onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
    }
    echo "你的IP地址:" . $onlineip;
?>
最后修改:2021 年 09 月 26 日 08 : 52 PM
如果觉得我的文章对你有用,请随意赞赏