Главная страница статей --> Хитрости при программировании php, заметки по базам данных

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

Источник: realcoding.net

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

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



Похожие статьи:
- Простой тултип или всплывающая подсказка
- FAQ по ЧПУ (человекопонятные URL)
- Дверца в защите: почтовый веб-интерфейс
- Чем CSS хорош для поисковых машин?
- Работа с MySQL. Деревья
- Манипулирование датой на PHP
- Несвоевременные мысли о CSS
- Тотальная Автоматизация Приема платежей на сайте
- Как обогнать конкурентов и сразу делать лидерские страницы
- Сокращение времени загрузки страниц с помощью CSS
- XML: время пришло
- Полезные советы по оптимизации ASP-приложений
- Руководство по TCP/IP для начинающих


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]