问题是我无法在某些共享主机或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_IP
,HTTP_X_FORWARDED_FOR
,HTTP_X_FORWARDED
,HTTP_X_CLUSTER_CLIENT_IP
,HTTP_FORWARDED_FOR
,HTTP_FORWARDED
和REMOTE_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地址查找。