Определение региона посетителя сайта

драйвер от аудашки Creative всегда убивал меня своей истинной американскостью. "Выберите ваш регион". Пункты: 1.Америка 2.Все другие регионы. bash.org.ru
Задача состоит в том, чтобы, опираясь на данные, передаваемые посетителем сайта, определить его региональное положение. Это может понадобиться для того, чтобы по умолчанию отразить на сайте нужную контактную информацию или альтернативный контент. Для определения региона посетителя сайта можно использовать как серверные, так и клиентские технологии.

Определение региона с помощью nginx

Этот способ целесообразно использовать, если сайт находится на собственном виртуальном или физическом сервере. В этом случае изменение конфигурации nginx и загрузка баз не составят большого труда.  Процесс осуществляется в четыре шага: 1. Ставим базу GeoIP. Страны есть в deb-пакете. Для определения города придется скачать свой пакет.
sudo apt-get install geoip-database libgeoip-dev
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
2. Добавляем в /etc/nginx/nginx.conf в секцию http строки:
http {
....
# GeoIP
geoip_country /usr/share/GeoIP/GeoIP.dat; # the country IP database
geoip_city /usr/share/GeoIP/GeoLiteCity.dat; # the city IP database
..
}
3. В файл /etc/nginx/fastcgi_params добавляем переменные, котоыре будут передаваться в массив $_SERVER веб-приложения:
# For GeoIP
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
Этот файл должен быть подключен в параметрах виртуального хоста nginx. 4. Перезапускаем сервер
sudo service nginx restart
Определение региона сайта с помощью php Если модификация настроек nginx невозможна, или данный сервер отсутствует, определить регион посетителя можно с помощью библиотеки geoip. Если библиотека подключена, становятся доступными следующие функции:
  • geoip_continent_code_by_name — Получить двухбуквенный код континента
  • geoip_country_code_by_name — Получить двухбуквенный код страны
  • geoip_country_code3_by_name — Получить трехбуквенный код страны
  • geoip_country_name_by_name — Возаращает полное название страны
  • geoip_database_info — Получить версию БД GeoIP
  • geoip_db_avail — Проверить доступность БД GeoIP
  • geoip_db_filename — Возвращает имя файла БД GeoIP
  • geoip_db_get_all_info — Возвращает всю информацию о файлах БД в виде многомерного массива
  • geoip_id_by_name — Возвращает скоростную метрику интернет-канала пользователя (GEOIP_UNKNOWN_SPEED/GEOIP_DIALUP_SPEED/GEOIP_CABLEDSL_SPEED/GEOIP_CORPORATE_SPEED ).
  • geoip_isp_by_name — Возвращает имя провайдера (ISP) пользователя
  • geoip_org_by_name — Возвращает имя организации, за которой закреплен IP пользователя.
  • geoip_record_by_name — Возвращает информацию о местоположении пользователя (континент, страна, город, широта и долгота).
  • geoip_region_by_name — Возвращает код страны и региона
  • geoip_region_name_by_code — Возвращает название региона страны и код региона
  • geoip_time_zone_by_country_and_region — Возвращает часовой пояс клиента (по вычисленной стране и региону).
Если библиотека не подключена, но есть возможность ее установить, то это делается так: 1. Закачиваем и устанавливаем базу и модуль для php.
sudo apt-get install geoip-database libgeoip-dev php5-geoip
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
2. Проверяем, чтобы расширение php было подключено (/etc/php5/fpm/conf.d), и перезагружаем интерпретатор.
sudo service php5-fpm restart
3. Проверяем установку:
<?=geoip_record_by_name($_SERVER['REMOTE_ADDR']);?>

Определение региона сайта с помощью javascript

Этот способ подойдет, если нет возможности определения региона пользователя на уровне сервера. На мой взгляд, лучшим решением является зарегистрировать свой сайт в сервисе http://ipgeobase.ru/ и использовать возвращаемые данные на сайте. Сервис возвращает в формате xml данные о локации пользователя. Т.к. данные структурированы, с ними легко работать. Посмотреть возвращаемый результат можно, введя в браузере http://ipgeobase.ru:7020/geo?ip=Ваш_ip например: http://ipgeobase.ru:7020/geo?ip=195.133.205.114 На jquery разбор будет примерно такой:
$.get("http://ipgeobase.ru:7020/geo?ip=", function(data) {
var myregion = $(data).find("region").text();
//делаем что-то с данными
return true;
}, "xml")
Минусов у такого решения много: 1) Не работает без javascript 2) Надо обязательно предусмотереть отсутствие кеширования, т.е. скрипт не должен кешироваться системой управления контентом 3) Т.к. работа скрипта зависит от стороннего сервиса, снижается его надежность   Если при создании сайта не была предусмотрена возможность работы с регионами, сделать соответствующую доработку совершенно не сложно.