Получение поддержки IPv6 с помощью php5-geoip и базы данных Maxmind

У меня есть настройка geoip, выполнив эти идентичные шаги (http://php.net/manual/en/geoip.setup.php):

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

sudo apt-get install php5-geoip

Это прекрасно работает и уже несколько лет работает с IPv4-адресами. Я, однако, не осознавал, насколько он сломался с входящими устройствами IPv6. Например, он возвращает Notice: geoip_country_code_by_name(): Host 26xx:8:xx00:cf20:caxx:ff:fexx:35b5 not found

Я прошел через довольно много вещей, пытаясь заставить его работать, в том числе:

  • тестирование на адрес v6 и использование geoip_open("/usr/share/GeoIP/GeoIPv6.dat", GEOIP_STANDARD);

Видимо geoip_open не является доступной функцией аля php5-geoip

  • Я пытался использовать geoip_country_code_by_name_v6($ip)

Это еще одна функция, которая недоступна, хотя geoip_country_code_by_name($ip) работает отлично.

Пока безрезультатно.

Можно ли как-нибудь легко в моем PHP-коде выбрать, какую базу данных я хочу использовать, чтобы я мог просто проверить, является ли это адрес IPv4 или IPv6, и загрузить соответствующую базу данных?

1

Решение

Для поддержки IPv6-> кода страны легко и без ненужных файлов на основе вышеупомянутой интеграции:

Возьмите копию последних устаревших данных IPv6 (я предполагаю, что у вас уже есть двоичный файл IPv4):

wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz

Распакуйте и переместите его в каталог, доступный для вашего веб-сервера:

gunzip GeoIPv6.dat
mv GeoIPv6.dat /etc/usr/share/GeoIP/GeoIPv6.dat

Возьмите копию geoip.inc из git dir Maxmind (https://github.com/maxmind/geoip-api-php/blob/master/src/geoip.inc) и сохраните его где-нибудь, к которому вы сможете получить доступ, где бы вам ни понадобилось запускать geoip.

Если у вас установлен php5-geoip, как я сделал, удалите его с sudo apt-get remove php5-geoip; чистка по мере необходимости.

Сделав вышесказанное, вы можете проверить входящий IP-адрес для v4 или v6 и получить соответствующие результаты.

Пример:

<?php
include_once('geoip.inc');

//set an IPv6 address for testing
$ip='2601:8:be00:cf20:ca60:ff:fe09:35b5';

/*
test if $ip is v4 or v6 and assign appropriate .dat file in $gi
run appropriate function geoip_country_code_by_addr() vs geoip_country_code_by_addr_v6()
*/
if((strpos($ip, ":") === false)) {
//ipv4
$gi = geoip_open("/usr/share/GeoIP/GeoIP1.dat",GEOIP_STANDARD);
$country = geoip_country_code_by_addr($gi, $ip);
}
else {
//ipv6
$gi = geoip_open("/usr/share/GeoIP/GeoIPv6.dat",GEOIP_STANDARD);
$country = geoip_country_code_by_addr_v6($gi, $ip);
}
echo $ip . "<br>" . $country;

Это специально для страны, но может быть легко воспроизведено для данных города.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]