GeoIP
GeoIP — библиотека для определения местоположения по ip-адресу, поддерживается компанией MaxMind. Опредение местоположения основывается на регулярно обновляемой базе данных по принадлежности ip-адресов организациям в разных странах. Существуют платные и бесплатные базы.
Для подключения функций GeoIP к php необходимо установить модуль php-pecl-geoip, после установки которого станут доступны функции GeoIP (http://www.php.net/manual/ru/book.geoip.php).
Подключить GeoIP можно не к php, а непосредственно к Apache, установив модуль mod_geoip (репозиторий CentALT):
yum -y install mod_geoip
После установки mod_geoip появятся переменные окружения GEOIP_COUNTRY_CODE, GEOIP_COUNTRY_NAME, GEOIP_CITY, которые будут содержать двухбуквенный код страны, полное название страны, название города.
Использовать эти переменные можно для разных целей.
Если в коде php нужна эта информация, можно обойтись без установки модуля php, а брать значения прямо из окружения:
$country = getenv("GEOIP_COUNTRY_CODE"); $city = getenv("GEOIP_CITY");
Можно заблокировать китайцев и американцев через .htaccess:
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry Deny from env=BlockCountry
Можно, наоборот, разрешить доступ только своим:
SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry SetEnvIf GEOIP_COUNTRY_CODE UA AllowCountry SetEnvIf GEOIP_COUNTRY_CODE BY AllowCountry Deny from All Allow from env=AllowCountry
Можно переадресовывать на национальнцю версию сайта:
RewriteEngine on RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^DE$ RewriteRule ^(.*)$ http://de.site.ru$1 [L]
А можно просто писать город и страну в лог, для чего надо будет изменить описание формата лога в httpd.conf:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" (%{GEOIP_CITY}e, %{GEOIP_COUNTRY_CODE}e)" combined
Точность определения зависит от актуальности используемых баз данных, которые необходимо регулярно обновлять с http://geolite.maxmind.com/download/geoip/database/. При обновлении системы командой yum update обновления баз GeoIP не происходит, об их обновлении надо позаботиться самому. Размещаются базы данных в /usr/share/GeoIP. Надо установить три базы: GeoIP.dat, GeoIPv6.dat, GeoLiteCity.dat.