php 获取ip

客户端


在讨论获取客户端IP 地址前,我们首先下弄明白的是以下三个的具体含义:


1、REMOTE_ADDR;


2、HTTP_CLIENT_IP;


3、HTTP_X_FORWARDED_FOR


REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。 


HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。


同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。


$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP'];   //代理端的(有可能存在,可伪造)(网上搜索了很多文章,写的都是HTTP_VIA,我觉得HTTP_CLIENT_IP是正确的!)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)http_x_forwarded_for
一、没有使用代理服务器的情况:


REMOTE_ADDR = 您的 IP
HTTP_CLIENT_IP = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
 


二、使用透明代理服务器的情况:Transparent Proxies


REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_CLIENT_IP = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。


 


三、使用普通匿名代理服务器的情况:Anonymous Proxies


REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_CLIENT_IP = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。


 


四、使用欺骗性代理服务器的情况:Distorting Proxies


REMOTE_ADDR = 代理服务器 IP
HTTP_CLIENT_IP = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
 告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。


 


五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)


REMOTE_ADDR = 代理服务器 IP
HTTP_CLIENT_IP = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。


六、获取客户端IP地址方法总结 
        方法一:


                //php获取ip的算法 
                $iipp=$_SERVER["REMOTE_ADDR"]; 
                echo $iipp;


        方法二:


                //php获取ip的算法 (康盛的discuz x1.5用的是此方法)
                $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; 
                $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"]; 
                echo $user_IP;


                function get_real_ip(){ 
                $ip=false; 
                if(!empty($_SERVER["HTTP_CLIENT_IP"])){ 
                    $ip = $_SERVER["HTTP_CLIENT_IP"]; 
                } 
                if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
                    $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']); 
                if ($ip) { array_unshift($ips, $ip); $ip = FALSE; } 
                    for ($i = 0; $i < count($ips); $i++) { 
                     if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {     //为什么
                            $ip = $ips[$i]; 
                            break; 
                        } 
                    } 
                } 
                return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); 
                } 
                echo get_real_ip();


         方法三:


                //php获取ip的算法 
                if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) { 
                      $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; 
                } elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) { 
                      $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"]; 
                }elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]) { 
                     $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; 
                } elseif (getenv("HTTP_X_FORWARDED_FOR")) { 
                     $ip = getenv("HTTP_X_FORWARDED_FOR"); 
                } elseif (getenv("HTTP_CLIENT_IP")) { 
                     $ip = getenv("HTTP_CLIENT_IP"); 
                } elseif (getenv("REMOTE_ADDR")) { 
                     $ip = getenv("REMOTE_ADDR"); 
                } else { 
                    $ip = "Unknown"; 
                } 
                echo "你的IP:".$ip ;


          方法四: 
                //php获取ip的算法 
                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;


 注意:getenv()默认不支持IIS的isapi方式运行的php,在IIS下的PHP环境里,php.ini 中的 variables_order = “EGPCS” 当包括 “E” 时getenv才起作用,否则是取不到任何数据的。
服务器端
服务器端IP相关的变量 1. $_SERVER["SERVER_NAME"],需要使用函数gethostbyname()获得。这个变量无论在服务器端还是客户端均能正确显示。  2. $_SERVER["SERVER_ADDR"],在服务器端测试:127.0.0.1(这个与httpd.conf中BindAddress的设置值相关)。在客户端测试结果正确。


 
 


 
类如下:


 
class getIP{    
 function serverIP(){    
  return gethostbyname($_SERVER["SERVER_NAME"]);    
 }    
}    
     
$getIP  = new getIP();    
$serverIp = getIP::serverIP();    
echo 'Server IP is ',$serverIp,'<br />';   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值