2009-11-05 60 views
1

我需要获取用户的IP地址跨越使用PHP的代理... 任何建议?我需要得到的IP地址

+1

当然你可以谷歌呢? – Davie 2009-11-05 10:48:53

+6

给他的答案,而不是像这样愚蠢的评论。 – 2009-11-05 10:56:12

+0

这个问题在SO上有很多重复。 – 2009-11-05 11:50:34

回答

5

通常代理服务器添加特定的头部X-Forwarded-For,你可以在通过PHP服务器变量$_SERVER['HTTP_X_FORWARDED_FOR']

1

这是一个很难的事情,而不是所有代理将提供用户的真实IP检查。我写了这个功能,以前试图找到用户的最有可能的IP,但:

function get_ip_address() { 

    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_CLIENT_IP'])) 
     return $_SERVER['HTTP_CLIENT_IP']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_COMING_FROM'])) 
     return $_SERVER['HTTP_COMING_FROM']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_COMING_FROM'])) 
     return $_SERVER['HTTP_X_COMING_FROM']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED'])) 
     return $_SERVER['HTTP_FORWARDED']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED'])) 
     return $_SERVER['HTTP_X_FORWARDED']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED_FOR'])) 
     return $_SERVER['HTTP_FORWARDED_FOR']; 
    elseif (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED_FOR'])) 
     return $_SERVER['HTTP_X_FORWARDED_FOR']; 
    else return $_SERVER['REMOTE_ADDR']; 

} 

这个函数只是返回1 IP,如果你只是在数据库或一些存储IP,但我也有类似的功能,这给一个基于文本的回应,找到所有可能的IP。

function get_txt_ip_address() { 

    $return = ''; 

    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_CLIENT_IP'])) 
     $return .= $_SERVER['HTTP_CLIENT_IP']." (client)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_COMING_FROM'])) 
     $return .= $_SERVER['HTTP_COMING_FROM']." (cf)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_COMING_FROM'])) 
     $return .= $_SERVER['HTTP_X_COMING_FROM']." (xcf)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED'])) 
     $return .= $_SERVER['HTTP_FORWARDED']." (fw)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED'])) 
     $return .= $_SERVER['HTTP_X_FORWARDED']." (xfw)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_FORWARDED_FOR'])) 
     $return .= $_SERVER['HTTP_FORWARDED_FOR']." (fwf)/"; 
    if (ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})",$_SERVER['HTTP_X_FORWARDED_FOR'])) 
     $return .= $_SERVER['HTTP_X_FORWARDED_FOR']." (xfwf)/"; 

    $return .= $_SERVER['REMOTE_ADDR']." (ra)/"; 
    $return .= gethostbyaddr($_SERVER['REMOTE_ADDR']); 

    return $return; 

}