2015-09-07 44 views
3

我正在實施一些geoIP功能來將用戶從我的.com網站重定向到相關的國家域(.fr,.es,.co.uk等)。返回的地理信息服務功能0

我已經在我的index.php以下檢查用戶IP:

ini_set('display_errors', 1); 
require_once("geoip.inc"); 
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD); 
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']); 
geoip_close($gi); 

if($country_code == 'ES') 
{ 
     header('Location: https://www.testsite.es'); 
} 
elseif($country_code == 'GB') 
{ 
     header('Location: https://www.testsite.co.uk'); 
} 
elseif($country_code == 'FR') 
{ 
     header('Location: https://www.testsite.fr'); 
} 
else { 
     header('Location: https://www.testsite.com/home'); 
} 

當我檢查$country_code變量它是一個空字符串,因此上面的失敗,我總是打https://www.testsite.com/home .. 。

我開始鑽研代碼,發現我首先調用這個方法:

function geoip_country_code_by_addr($gi, $addr) { 

    if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) { 
     $record = geoip_record_by_addr($gi, $addr); 
     if ($record !== false) { 
      return $record->country_code; 
     } 
    } else { 
     $country_id = geoip_country_id_by_addr($gi, $addr); 

     if ($country_id !== false) { 
      return $gi->GEOIP_COUNTRY_CODES[$country_id]; 
     } 
    } 
    return false; 
} 

這CAL ls:

function geoip_country_id_by_addr($gi, $addr) { 
    $ipnum = ip2long($addr); 
    return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN; 
} 

我不明白爲什麼它一直失敗並返回'0'?我使用Maxminds geoip.inc php來檢查國家代碼。

我檢查了mbstring在我的php.ini文件中啓用,它是。出於某種原因,它只是沒有找到基於我傳遞給它的IP的國家代碼。有沒有人有任何幫助可能造成這種情況?

+0

並非每個IP地址都與一個位置相關聯(並且任何geoip服務返回的位置最多隻是一個受過教育的猜測)。這是發生在你傳遞的所有地址嗎? – Piskvor

+0

是的,我甚至用我自己的IP地址嘗試過,當我用'PECL'使用php地理IP時,我知道過去我工作過的IP地址。當然你可能會說爲什麼我不這樣使用,但不幸的是我不能走這條路。 – Javacadabra

回答

0

只是想說我已經解決了這個問題。我的一個錯誤,可能是一個跡象,我需要休息一下!

geoip.inc.php通過的MaxMind提供我最初收到這些錯誤:

無法在管道438

重新聲明geoip_country_code_by_name()在geoip.inc爲了解決這個問題,我只是檢查是否定義的方法和如果我無法使用,如下所示:

if (!function_exists('geoip_country_code_by_name')) { 
    function geoip_country_code_by_name($gi, $name) { 
     $country_id = geoip_country_id_by_name($gi, $name); 
     if ($country_id !== false) { 
      return $gi->GEOIP_COUNTRY_CODES[$country_id]; 
     } 
     return false; 
    } 
} 

我不幸有在上面的代碼較小錯字其正常執行,因此returing 0每一次防止代碼。