Я работаю над реализацией некоторых geoIP
функциональность для перенаправления пользователя с моего сайта .com на домен соответствующей страны (.fr, .es, .co.uk … и т. д.).
У меня есть следующее в моем 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;
}
который звонит:
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-адресу, который я ему передаю. Кто-нибудь имеет какую-либо помощь с точки зрения того, что может быть причиной этого?
просто хотел сказать, что я решил проблему. Ошибка с моей стороны и, вероятно, знак того, что мне нужен перерыв!
В geoip.inc.php
предоставленный Maxmind, я первоначально получал эти ошибки:
Невозможно повторно объявить geoip_country_code_by_name () в geoip.inc в строке 438
Чтобы исправить это, я просто проверяю, определен ли метод, и если нет, я использую его следующим образом:
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;
}
}
У меня, к сожалению, была небольшая опечатка в приведенном выше коде, которая препятствовала правильному выполнению кода и, следовательно, возвращала 0 каждый раз.
Других решений пока нет …