GeoIPНеплохо бы было показывать посетителю на сайте его страну, провайдера и подобную информацию, верно? В этой заметке я расскажу, как настроить такие вещи с помощью apache и FreeBSD. Причем PHP загружается как модуль apache.

На первый взгляд может показаться, что достаточно просто обратится с помощью whois к соответствующим координационным организациям (в Европе это RIPE NCC). Однако в таком случае есть реальный риск оказаться обманутым злоумышленниками, ведь записи о регионе RIPE проверяет только при выдаче блока адресов, далее можно написать там любую страну. Поэтому создана для хранения географической принадлежности IP-адресов. Обмануть эту организацию гораздо сложнее. На первый взгляд можно было организовать API  и возвращать информацию о геолокации, например в формате json, всем желающим.  Однако с ростом популярности подобного анализа возрастает риск того, что сервера не смогут обработать такое количество запросов. Поэтому компания придерживается иной политики — базы устанавливаются локально у анализирующих серверов.

Поэтому  и нам придется скачать и установить базу на FreeBSD локально. Установка из портов не годиться, поскольку там будет устаревшая версия (для RELEASE 8.2 это 1.4.6, а на момент написания статьи уже доступна версия 1.4.8). Скачивать исходники с официального сайта также бесполезно, поскольку собрать их не получится. Зато базу можно поставить из последнего набора пакетов на официальном сайте FreeBSD, например так:

# pkg_add -r ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9-current/net/GeoIP-1.4.8_1.tbz

Далее следует поставить расширение PHP GeoIP:

# pecl install geoip

В файл /usr/local/etc/php/extensions.ini добавляем строку

extension=geoip.so

Для полного счастья скачиваем архив с флагами стран согласно формата .

# fetch http://www.famfamfam.com/lab/icons/flags/famfamfam_flag_icons.zip
# unzip -x famfamfam_flag_icons.zip

Создаем в рабочей директории веб-сервера тестовый файл следующего содержания:

<?php
$ip = $_SERVER["REMOTE_ADDR"];
$code2 = geoip_country_code_by_name($ip);
$flag = 'png/' . ($code2) . '.png';
echo 'IP: ' . $ip . ' ' . geoip_country_code_by_name($ip)
. " <img src=\"{$flag}\" alt=\"{$code2}\" /> "
. geoip_country_name_by_name($ip);

При открывании страницы получим информацию:

GeoIP

Более подробную информацию можно получить только в платной базе. В принципе во многих случаях будет достаточно закешировать данные, полученные с помощью  whois и сверять с общедоступной базой.

 

 

 

через торрент. .