![](/img/trans.png)
[英]Codeigniter app in shared hosting can't connect to remote mysql in vps
[英]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_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地址查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.