Модуль определения географического положения по IP - mod_GeoIP
🕛 25.10.2006, 13:07
Неплохой модуль для apache1.3 - по IP посетителя определяется его страна, регион и город. Может пригодиться, чтобы зарубить левых посетителей - китайцев, например, или америкосов. Всё равно им у меня на сайте делать нечего :) Итак, ставим из портов:/usr/home/lissyara/>
/usr/home/lissyara/>cd /usr/ports/
/usr/ports/>make search name='mod_geoip'
Port: mod_geoip-1.2.7
Path: /usr/ports/www/mod_geoip
Info: An Apache module that provides the country code of the client's IP
Maint: seanc@FreeBSD.org
B-deps: GeoIP-1.3.14 apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2
R-deps: GeoIP-1.3.14 apache-1.3.34_3 expat-1.95.8_3 perl-5.8.7_2
WWW: http://www.maxmind.com/app/mod_geoip
Port: mod_geoip2-1.1.7
Path: /usr/ports/www/mod_geoip2
Info: An Apache module that provides the country code of the client's IP
Maint: jau@iki.fi
B-deps: GeoIP-1.3.14 apache-2.0.55_2 expat-1.95.8_3 libiconv-1.9.2_1 perl-5.8.7_2
R-deps: GeoIP-1.3.14 apache-2.0.55_2 expat-1.95.8_3 libiconv-1.9.2_1 perl-5.8.7_2
WWW: http://www.maxmind.com/app/mod_geoip
/usr/ports/>cd /usr/ports/www/mod_geoip
/usr/ports/www/mod_geoip/>make && make install && make clean
..
..
************************************************************
Please edit your apache.conf or httpd.conf to enable and
setup this module.
You can always refer to the useful documents held in
${PREFIX}/share/doc/mod_geoip/, where ${PREFIX} is
typically /usr/local.
When it's done, do the following to take effect:
apachectl configtest (and correct any errors reported) apachectl restart
************************************************************
/usr/ports/www/mod_geoip/>pkg_info | grep "[Gg]eo"
GeoIP-1.3.14 Find the country that any IP address or hostname originates
mod_geoip-1.2.7 An Apache module that provides the country code of the clie
/usr/ports/www/mod_geoip/>
Он за собой тащит собственно GeoIP - из него ему нужна БД. После установки редактируем конфиг апача - раскомментруем модуль mod_geoip:
/usr/local/etc/apache/httpd.conf
LoadModule geoip_module libexec/apache/mod_geoip.so
AddModule mod_geoip.c
И добавляем такие строки:
<IfModule mod_geoip.c> ##### модуль GeoIP начался # # Включаем модуль GeoIPEnable On # Указываем путь к БД (в доках говориться, что # надо тока если местоположение БД нестандартное, но # какое считается стандартным - нигде не нашёл - потому # на всякий случай указываю) - БД инсталлится вместе с # портом GeoIP. GeoIPDBFile /usr/local/share/GeoIP/GeoIP.dat # Следующая директива устанавливает где применяется модуль # GeoIP (по крайней мере я так понял) - тока в примечаниях apache (Notes), # только в переменных окружения (Env) или везде (All - по дефолту): GeoIPOutput All # заставляет проверять БД GeoIP.dat чтобы определить, обновлялась ли БД # нужно чтобы не перезапускать апач при обновлении БД GeoIPFlags CheckCache ###### пример блокировки отдельных стран # Блокируем косоглазеньких - всё равно ничё не поймут SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry # Блокируем америкосов - тоже ничё не поймут, тупые слишком. SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry # Что мы, собствено, делаем по вышеуказанным правилам, # это должно быть в директории которую блокируем, т.е. внутри # <Directory "/usr/local/www/data"> # ... #Deny from env=BlockCountry # </Directory> </IfModule>После чего перезапускаем апач, и пробуем, что у нас получилось, таким скриптиком, на php:
<pre> Откуда припёрся: <?php $country_code = apache_note("GEOIP_COUNTRY_CODE"); $region = apache_note("GEOIP_REGION"); $country_name = apache_note("GEOIP_COUNTRY_NAME"); $city = apache_note("GEOIP_CITY"); echo "Код страны: " . $country_code . "\n"; echo "Регион: " . $region . "\n"; echo "Имя страны: " . $country_name . "\n"; echo "Город: " . $city . "\n"; ?> </pre>
Вот его вывод, для московского IP:
Откуда припёрся:
Код страны: RU
Регион:
Имя страны: Russian Federation
Город:
Если заходить с частного IP (192.168.x.x) то не покажет ничего :) Почему не показал регион и город - я так думаю что нас считают страной дикой, где кроме медведей, ядерных ракет, и людей в телогрейках и шапках-ушанках ничего и нету... Кстати, в примерах, на сайте автора модуля, был пример, как заблокировать доступ с региона RU. Я же в ответ привёл примёр как залочить буржуев :) Пшли нах :)
P.S. Добавлено по итогам первого комментария. Где взять базы - тут лежит какая-то программа, не вникал. К ней идуд базы. Надо поставить `expert`-версию, после чего установятся базы. Базы копируем куда надо, правим чутка конфиг:
<IfModule mod_geoip.c>
##### модуль GeoIP начался
#
# Включаем модуль
GeoIPEnable On
# Указываем путь к БД (в доках говориться, что
# надо тока если местоположение БД нестандартное, но
# какое считается стандартным - нигде не нашёл - потому
# на всякий случай указываю) - БД инсталлится вместе с
# портом GeoIP.
GeoIPDBFile /usr/local/share/GeoIP/GeoIP.dat
GeoIPDBFile /usr/local/share/GeoIP/GeoIPCity.dat
GeoIPDBFile /usr/local/share/GeoIP/GeoIPOrg.dat
# Следующая директива устанавливает где применяется модуль
# GeoIP (по крайней мере я так понял) - тока в примечаниях apache (Notes),
# только в переменных окружения (Env) или везде (All - по дефолту):
GeoIPOutput All
# заставляет проверять БД GeoIP.dat чтобы определить, обновлялась ли БД
# нужно чтобы не перезапускать апач при обновлении БД
GeoIPFlags CheckCache
###### пример блокировки отдельных стран
# Блокируем косоглазеньких - всё равно ничё не поймут
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
# Блокируем америкосов - тоже ничё не поймут, тупые слишком.
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
# Что мы, собствено, делаем по вышеуказанным правилам,
# это должно быть в директории которую блокируем, т.е. внутри
# <Directory "/usr/local/www/data">
# ...
#Deny from env=BlockCountry
# </Directory>
</IfModule>
После чего доступно больше данных (судя по всему есть ещё база провайдеров, т.к. ISP у меня не высвечивается):
<? <pre> <b>Откуда припёрся</b> <?php $country_code = apache_note("GEOIP_COUNTRY_CODE"); $region = apache_note("GEOIP_REGION"); $country_name = apache_note("GEOIP_COUNTRY_NAME"); $city = apache_note("GEOIP_CITY"); $connect_type = apache_note("GEOIP_NETSPEED"); $dma_code = apache_note("GEOIP_DMA_CODE"); $area_code = apache_note("GEOIP_AREA_CODE"); $latitude = apache_note("GEOIP_LATITUDE"); $longitude = apache_note("GEOIP_LONGITUDE"); $postal_code = apache_note("GEOIP_POSTAL_CODE"); $organization = apache_note("GEOIP_ORGANIZATION"); $isp = apache_note("GEOIP_ISP"); echo "Код страны: " . $country_code . "\n"; echo "Регион: " . $region . "\n"; echo "Имя страны: " . $country_name . "\n"; echo "Город: " . $city . "\n"; echo "Скорость: " . $connect_type . "\n"; echo "dma_code: " . $dma_code . "\n"; echo "area_code: " . $area_code . "\n"; echo "latitude: " . $latitude . "\n"; echo "longitude: " . $longitude . "\n"; echo "postal_code: " . $postal_code . "\n"; echo "Организация: " . $organization . "\n"; echo "Провайдер: " . $isp . "\n"; ?>Откуда припёрся
Код страны: RU
Регион: 48
Имя страны: Russian Federation
Город: Moscow
Скорость:
dma_code: 0
area_code: 0
latitude: 55.752201
longitude: 37.615601
postal_code:
organization:Network of NICEVT
isp:
Половина пунктов не вполне понятна... Ну да и не важно.