PHP:无法在共享主机和某些VPS上获取访问者IP


PHP: Can't get visitor IP on shared hosting and some VPS

问题是我无法在某些共享主机或VPS上获取访问者IP。

这是我的"强大"功能:

function get_IP(){
    $findIP=array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    );
    $blacklistIP=array(
        '127.0.0.1',
        '255.255.255.255',
    );
    $ip = '';
    foreach($findIP as $http)
    {
        if(function_exists("getenv"))
        {
            $ip = getenv($http);
        }
        else
        {
            if (array_key_exists($http, $_SERVER) !== false){
                foreach (explode(',', $_SERVER[$http]) as $findIP){
                    $ip = trim($findIP);
                }
            }
        }
        if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) return $ip;
        }
        else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            return $ip;
        }
    }
    return '0.0.0.0';
}

此功能在普通服务器上完美运行,但一些共享和VPS给我带来了很多问题。

一些服务器返回我127.0.0.1,在某些服务器上HTTP_CLIENT_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDEDREMOTE_ADDR返回空或未设置。

我的错误在哪里?是缺少什么还是我能做什么?谢谢!

你 https://github.com/symfony/http-foundation/blob/master/Request.php#L792-L834 尝试过这样的事情吗?

我认为symfony由于其受欢迎程度而正确处理了这个问题。如果没有,你能发布print_r($_SERVER)的结果吗?

好吧,解决这个问题我解决了问题,我会给你答案我的问题:

/*
* IP Address Lookup
* @author Ivijan-Stefan Stipic
*/
function get_IP(){
    // check any protocols
    $findIP=array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR',
        'BAN_CHECK_IP',
        'HTTP_X_FORWARDED_HOST'
    );
    // IP blacklist - you can add array from your database
    $blacklistIP=array(
        '127.0.0.1',
        '255.255.255.255',
    );
    $ip = '';
    // start looping
    foreach($findIP as $http)
    {
        // Check in $_SERVER
        if (array_key_exists($http, $_SERVER) !== false){
            $ip=$_SERVER[$http];
        }
        // check in getenv() for any case
        if(empty($ip) && function_exists("getenv"))
        {
            $ip = getenv($http);
        }
        // Check if here is multiple IP's
        if(!empty($ip))
        {
            $ips=explode(",",$ip);
            $ipMAX=count($ips);
            if($ipMAX>0)
            {
                if($ipMAX > 1)
                    $ip=trim(end($ips));
                else
                    $ip=trim($ips[0]);
            }
        }
        // Check if IP is real and valid
        if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false)
        {
            return $ip;
        }
        else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            return $ip;
        }
    }
    return '0.0.0.0';
}

代码内部的问题是,有时 X 转发器返回多个 IP 的逗号分隔可能造成问题的内容。此外,一些主机可以是IP,一些被禁止的IP地址可以访问您的网站。我添加该规则并提取一个 IP 可以是一个列表。这给了我一个深入的IP地址查找。

感谢您的帮助和某人 -1 迫使我更深入地挖掘问题并解决问题。我认为这是互联网上最完整的IP地址查找。