<?   
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 $onlineip;   
?> 我在网上找到如上代码,返回客户端IP地址,用getenv('REMOTE_ADDR')不就行了么?为什么还要那么一连串的判断呢?不解,请各位帮忙解释一下,谢谢

解决方案 »

  1.   

    有时候REMOTE_ADDR获取不到客户端地址!(比如说用代理服务器)再一个,获取地址最好用$_SERVER,getenv只在apache下起效!
      

  2.   

    如果客户是经过代理服务器访问你的网站,'REMOTE_ADDR'有可能是代理服务器的地址
      

  3.   

    他用的代理服务器的目的,就是不让你知道他的真实IP嘛,那用哪个可以得到真实IP?
      

  4.   


    $_SERVER["HTTP_X_FORWARDED_FOR"]一、没有使用代理服务器的PHP获取客户端IP情况:REMOTE_ADDR = 客户端IP
    HTTP_X_FORWARDED_FOR = 没数值或不显示二、使用透明代理服务器的情况:Transparent ProxiesREMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)
    这类代理服务器还是将客户端真实的IP发送给了访问对象,无法达到隐藏真实身份的目的。三、使用普通匿名代理服务器的PHP获取客户端IP情况:Anonymous ProxiesREMOTE_ADDR = 最后一个代理服务器 IP
    HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)
    这种情况下隐藏了客户端的真实IP,但是向访问对象透露了客户端是使用代理服务器访问它们的。四、使用欺骗性代理服务器的情况:Distorting ProxiesREMOTE_ADDR = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)
    这种情况下同样透露了客户端是使用了代理服务器,但编造了一个虚假的随机IP(220.4.251.159)代替客户端的真实IP来欺骗它。五、使用高匿名代理服务器的PHP获取客户端IP情况:High Anonymity Proxies (Elite proxies)REMOTE_ADDR = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 没数值或不显示无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些头消息未必能够取得到,因为不同的浏览器不同的网络设备可能发送不同的IP头消息。因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。