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