Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> mod_geoip

Модуль определения географического положения по IP - mod_GeoIP

Автор: lissyara.


    Неплохой модуль для 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:

Половина пунктов не вполне понятна... Ну да и не важно.



размещено: 2006-01-29,
последнее обновление: 2006-02-17,
автор: lissyara


jails, 2006-02-12 в 12:05:20

Для того что бы модуль показывал регион и город необходимы еще 2 базы: GeoIPCity.dat(19,359,354 байт) и GeoIPOrg.dat(81,218,923 байт), автор за них требует денег. Но выход есть, пишите на мыло поделюсь рецептом.

Тим, 2006-02-17 в 2:43:45

А нужно ли мудрить - они устаревшую на месяц базу предоставляют в виде GeoLite City http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

Проверю, сообщу...

Solltex, 2006-05-27 в 16:03:45

A kak sdelat redirekt im

BigHarry, 2006-12-09 в 22:55:00

По поводу фразу в предисловии:
"зарубить левых посетителей - китайцев, например, или америкосов. Всё равно им у меня на сайте делать нечего"
Я бы не советовал торопится рубить америкосов, а то потом будете недоумевать, почему гугль не индексирует ваш сайт...

123, 2007-10-08 в 12:51:53

!!

Alexey, 2007-12-22 в 1:52:05

Спасибо, хорошая статья.

Хочется добавить, что доп базы (GeoIPCity / GeoIPOrg) можно нарыть здесь:
_http_://_weblogexpert_._com_/_download.htm_

Zer0, 2008-04-11 в 18:32:08

могу поделиться базами
1,1M    GeoIP.dat
24M    GeoIPCity.dat
99M    GeoIPOrg.dat
Сцылко

Edik, 2008-10-31 в 8:34:37

Да. Спасибо. Очень все понятно написано, осталось только взять и проглотить. :)
А сайт очень онравился, добавил в закладки и временно подпишусь на рассылку :)

Mauzer, 2009-03-11 в 18:43:26

а ты лиссиара оказывается шовинист а???

Time, 2009-03-30 в 11:32:15

Как седлать чтобы он видел тачки из локалки?

Zer0, 2009-03-30 в 18:09:21

никак, да и смысла то?

Time, 2009-03-31 в 5:05:47

Да просто хотел сделать локальный сервачек вот и все:)

don, 2009-07-14 в 1:09:16

все хорошо, только ненаписано, что надо установить до этого http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz ... без него однако не работает, хотя может он в стандарте уже идет, но у меня не было

adre, 2009-11-24 в 12:09:11

2Zer0 ваши базы по ссылки актуальны? они всымысле которые полные, которые платные? =)

Zer0, 2009-11-24 в 14:45:09

  1088038  4 янв  2008 GeoIP.dat
29198413 20 ноя  2008 GeoIPCity.dat
 3697929 28 авг  2008 GeoIPISP.dat
103863410  2 янв  2008 GeoIPOrg.dat
раз в год лезу в инет ищу базы
это те базы что в архиве, в этом году не до них было

Zer0, 2009-11-24 в 15:20:19

  1088038  4 янв  2008 GeoIP.dat
43765917 24 ноя 14:13 GeoIPCity.dat
 3697929 28 авг  2008 GeoIPISP.dat
103863410  2 янв  2008 GeoIPOrg.dat
80271539 24 ноя 14:17 GeoIP.tar.bz2
чуток обновил;-)

mihagriha, 2014-04-10 в 23:02:04

www.latlong.ru
поиск географических координат, расширенный geo ip



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0454 секунд
Из них PHP: 35%; SQL: 65%; Число SQL-запросов: 77 шт.
Исходный размер: 38082; Сжатая: 8538