得到客户端IP老问题了,但这次环境有点不一样(  客户是这样的环境没办法,说BT的请飘过 :)  )。win2k3该系统(下称系统A)上装了VMware Server,VM下有个win2k3系统(下称系统B)。系统A:直接连接公网。有公网IP 218.72.xxx.xx。和VM网卡地址:192.168.222.1。开放80端口,映射到192.168.222.128的80端口。系统B:IP:192.168.222.128  网关:192.168.222.2VM设置NAT模式使得系统B能访问Internet。系统B上装有Apache+PHP。至此,访问218.72.xxx.xx:80可以直接连接系统B下Apache站点。需求:在系统B下,PHP站点 取得客户端IP。现在始终获取的是:192.168.222.1。有什么方法可以在系统B下取得客户端真实IP? 

解决方案 »

  1.   


    //这个函数拿到什么ip.. 楼主    function getIp()    {         if (@$_SERVER['HTTP_CLIENT_IP'] && $_SERVER['HTTP_CLIENT_IP']!='unknown') {               $ip = $_SERVER['HTTP_CLIENT_IP'];           } elseif (@$_SERVER['HTTP_X_FORWARDED_FOR'] && $_SERVER['HTTP_X_FORWARDED_FOR']!='unknown') {               $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];           } else {               $ip = $_SERVER['REMOTE_ADDR'];           }           return $ip;       }
      

  2.   

    function get_client_ip() {
    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);
    }用这个试下,应该可以的
      

  3.   

    测试无效的函数:
    PHP Code one:
    <?
    //php获取ip的算法
    $iipp=$_SERVER["REMOTE_ADDR"];
    echo $iipp;
    ?> 
    PHP Code two:
    <?php
    //php获取ip的算法
    $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 Code three:
    <? 
    //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 Code four:
    <?
    //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 $onlineip;
    ?>  <?php 
    function get_real_ip2(){ 
    $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 "x:".get_real_ip2(); function getIp()    {         if (@$_SERVER['HTTP_CLIENT_IP'] && $_SERVER['HTTP_CLIENT_IP']!='unknown') {               $ip = $_SERVER['HTTP_CLIENT_IP'];           } elseif (@$_SERVER['HTTP_X_FORWARDED_FOR'] && $_SERVER['HTTP_X_FORWARDED_FOR']!='unknown') {               $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];           } else {               $ip = $_SERVER['REMOTE_ADDR'];           }           return $ip;       }
      

  4.   

    Bridged方式,或许是个解决办法,相当于和主机同一级别。那就需要再分配一个公网IP。试试
      

  5.   

    <?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>";                            
    ?> 
      

  6.   

    <?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>";                            
    ?>