最近搞个数据库,要求收集用户访问IP.
但是根据我的测试,以下代码均无法得到用户的真实IP.
/////////////////////////////////////////////////////////////////////////////
方法一
<?php
function GetIP()
{
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
   $cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
   $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
   $cip = $_SERVER["REMOTE_ADDR"];
else
   $cip = "无法获取!";
return $cip;
}
echo "<br>";
?>方法二:
<?php
echo "<br>";
?><?
error_reporting (E_ERROR | E_WARNING | E_PARSE);
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."<br>";                            
?> 
方法三(最简单):
<?php
echo "<br>";
?><?
$iipp = $_SERVER["REMOTE_ADDR"];
echo $iipp;
echo "<br>";
?>方法四:
<?php
echo "<br>";
?><?php
$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."<br>";
?>方法五:
<?php
echo "<br>";
?><?
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();
echo "<br>";
?>方法六:
<?php
echo "<br>";
?><?
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;
echo "<br>";
?>
////////////////////////////////////////////////////////////////////////////////////////////////
以上代码均获取为一个不是我真实的IP,是路由器上的一个IP.我实在局域网测试的.
我通过访问www.ip138.com可以得到我的真实IP.现在求一个能得到真实IP的代码.

解决方案 »

  1.   

    怎么没人回答丫.
    对了我忘记说了我的网络有IPV4和IPV6.
    但是我只要像ip138.com那样获取ipv4即可.
    IPV6不用考虑.
      

  2.   

    我做的,不过测试只能得到本地的ip,就是。 function GetIP(){
       if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
               $ip = getenv("HTTP_CLIENT_IP");
           else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
               $ip = getenv("HTTP_X_FORWARDED_FOR");
           else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
               $ip = getenv("REMOTE_ADDR");
           else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
               $ip = $_SERVER['REMOTE_ADDR'];
           else
               $ip = "unknown";
       return($ip);
    }
    就是127.0.0.1.、
    还不知道上传到空间会怎样。。
      

  3.   

    太复杂了。
    getenv,对于IIS无效,只能用$_SERVER.
      

  4.   

    以上代码均获取为一个不是我真实的IP,是路由器上的一个IP.我实在局域网测试的.
    我通过访问www.ip138.com可以得到我的真实IP.
    --------------------------------------------------------------------------------------
    对楼主这句话有点点不解,前半句,
    取ip我就用这句
    ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
    楼主到这儿看看ip是不是真实的啦
    http://code.h2ero.cn/showip.php
      

  5.   

    这个dedecms获取ip的function GetIP()
    {
    if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    {
    $cip = $_SERVER["HTTP_CLIENT_IP"];
    }
    else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    else if(!empty($_SERVER["REMOTE_ADDR"]))
    {
    $cip = $_SERVER["REMOTE_ADDR"];
    }
    else
    {
    $cip = '';
    }
    preg_match("/[\d\.]{7,15}/", $cip, $cips);
    $cip = isset($cips[0]) ? $cips[0] : 'unknown';
    unset($cips);
    return $cip;
    }
      

  6.   

    还是跟我以上方法例举的一样,不是我的真正IP.我试过很多次,得到的都是路由器上的IP.但访问www.ip138.com却是我真正的IP.ip138上还显示我的单位.
    而上述所有方法只是得到一个联通的结点而已.