PHP获取真实的客户IP的方法

发布时间:2020-06-01编辑:脚本学堂
PHP获取真实的客户IP的方法,有需要的朋友,可以参考下。

服务器环境是apache+PHP,在配置Squid后会产生一个问题:
原先使用PHP预定义变量$_SERVER['REMOTE_ADDR']获取客户端的IP地址,现在这个变量的值是Squid代理的IP地址,比如假设Squid和Apache装在同一服务器上的话,现在$_SERVER['REMOTE_ADDR']是127.0.0.1。
为了取得真实的客户端IP地址,可以使用$_SERVER['HTTP_X_FORWARDED_FOR']来透过代理,这个变量在PHP的官方手册里的保留字列表|预定义变量|$_SERVER部分里没有提到,但在相应评论里可以找到。
'HTTP_X_FORWARDED_FOR'是HTTP协议头中的一部分,也就是说客户端可以伪造,使用时需要进行相应检测防止被利用,例如网站有封IP的功能,恶意用户可以伪造ip,使网站误封正常用户的IP。

php手册用户注释中提供了一个办法:
 

复制代码 代码如下:
if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
      if ($_SERVER["HTTP_CLIENT_IP"]) {
            $proxy = $_SERVER["HTTP_CLIENT_IP"];
      } else {
           $proxy = $_SERVER["REMOTE_ADDR"];
      }
     $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
     if ($_SERVER["HTTP_CLIENT_IP"]) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
      } else {
           $ip = $_SERVER["REMOTE_ADDR"];
      }
}
echo "Your IP $ip";
if (isset($proxy)) {
echo "Your proxy IP is $proxy";
}