Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:Can';无法在共享主机和一些VP上获得访客IP_Php_Server - Fatal编程技术网

PHP:Can';无法在共享主机和一些VP上获得访客IP

PHP:Can';无法在共享主机和一些VP上获得访客IP,php,server,Php,Server,问题是我无法在某些共享主机或VP上获取访问者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_FORWARDE

问题是我无法在某些共享主机或VP上获取访问者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';
}
这个功能在普通服务器上运行得很好,但是一些共享和VP给我带来了很多问题

一些服务器返回我
127.0.0.1
,在一些服务器上
HTTP\u CLIENT\u IP
HTTP\u FORWARDED\u FOR
HTTP\u FORWARDED
HTTP\u CLUSTER\u CLIENT\u IP
HTTP\u FORWARDED\u FOR
HTTP\u FORWARDED
REMOTE\u ADDR
返回空或未设置


我的错在哪里?是错过了什么,还是我能做什么?谢谢

你试过这样的东西吗


我认为symfony能够正确处理这一问题,因为它很受欢迎。如果没有,你能发布打印($\u服务器)?

的结果吗?好的,在这个问题上,我找到了问题,我会给你我的问题的答案:

/*
* 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地址查找


谢谢你的帮助和帮助,因为这迫使我深入挖掘问题并解决问题。我认为这是互联网上最完整的IP地址查找。

这些服务器是否使用反向代理来分割到不同主机的流量?我真的不知道。我可以查一下。那是我客户的服务器。@TZHX可能击中了要害。您可能获得的是代理服务器的IP地址,而不是客户端的IP地址。这可能是真的,但如何获得客户端地址呢?我需要的是,该网站可以正常运行。这可以是有趣的。他们使用
HTTP\u X\u FORWARDED\u来获得IP,但我在代码中使用了它。什么返回
HTTP\u X\u转发\u主机