<? 
function iptype1 () { 
if (getenv("HTTP_CLIENT_IP")) { 
   return getenv("HTTP_CLIENT_IP"); 

else { 
   return "none"; 


function iptype2 () { 
if (getenv("HTTP_X_FORWARDED_FOR")) { 
   return getenv("HTTP_X_FORWARDED_FOR"); 

else { 
   return "none"; 


function iptype3 () { 
if (getenv("REMOTE_ADDR")) { 
   return getenv("REMOTE_ADDR"); 

else { 
   return "none"; 


function ip() { 
$ip1 = iptype1(); 
  $ip2 = iptype2(); 
$ip3 = iptype3(); 
if (isset($ip1) && $ip1 != "none" && $ip1 != "unknown") { 
   return $ip1; 

elseif (isset($ip2) && $ip2 != "none" && $ip2 != "unknown") { 
   return $ip2; 

elseif (isset($ip3) && $ip3 != "none" && $ip3 != "unknown") { 
   return $ip3; 
}   
  else { 
  return "none"; 

} Echo ip(); 
?>转自 phpx.com

解决方案 »

  1.   

    phchenjie(【烦人】) 谢谢你的了FUANTCION 
    看来你是高手可以帮我解决一个数据库查询的问题吗?
      

  2.   

    3 楼那个方法其实不完全正确. 比如服务器端是用 load balancer + nfs 集群的, 那种方法就测不出用户 IP.一般要依次检测以下 4 个值:$_SERVER["HTTP_X_CLUSTER_CLIENT_IP"],
    $_SERVER["HTTP_X_FORWARDED_FOR"],
    $_SERVER["HTTP_CLIENT_IP"],
    $_SERVER["REMOTE_ADDR"]范例:function getClentIp() {
      $ip = $_SERVER["HTTP_X_CLUSTER_CLIENT_IP"];
      if (strlen($ip) <= 0) {
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
      }
      if (strlen($ip) <= 0) {
        $ip = $_SERVER["HTTP_CLIENT_IP"];
      }
      if (strlen($ip) <= 0) {
        $ip = $_SERVER["REMOTE_ADDR"];
      }
      return $ip;
    }
      

  3.   

    这样兼容好些,起码不会出错误码:
    function getClientIp() {
      if( isset($_SERVER["HTTP_X_CLUSTER_CLIENT_IP"]) )  $ip = $_SERVER["HTTP_X_CLUSTER_CLIENT_IP"];
      else if( isset($_SERVER["HTTP_CLIENT_IP"]) ) $ip = $_SERVER["HTTP_CLIENT_IP"];
      else if( isset($_SERVER["REMOTE_ADDR"]) ) $ip = $_SERVER["REMOTE_ADDR"];
      else $ip = "";
      return $ip;
    }
      

  4.   

    其实理论上没办法准确获得客户端IP的啊。
    因为即使用代理也分两种,一种透明,一种不透明的。
    不透明的话,也只能得到代理的IP而不是代理后边的客户端IP.....