Определине местоположения посетителя по IP | DAndreev.com

Определине местоположения посетителя по IP

PHP

На работе передо мной встала задача. Ограничить пользователям США доступ до определённого раздела сайта.
Это связано с какими-то юридическими аспектами, но не это сейчас важно.
Как узнать, что IP адрес посетителя находится в США?

По-правильному было бы хорошо воспользоваться библиотекой PHP GEO IP

Но, к сожалению сайт нашей компании находится на шаред хостинге, и установить свои дополнения к PHP не представляется возможным.

Тогда я решил прибегнуть к онлайн сервису распознавания IP адресов.
Во-первых: не нужно забивать базы данных запрещенных IP
Во-вторых: они обновляются постоянно, так что на 99% можно быть уверенным в точности распознавания

Один из таких сервисов: NetIP.de

Только проблема в том, что у этого сервиса отсутствует API интерфейс, потому пришлось парсить страницу.
Может есть и лучшее решение, но Google быстро с этим помочь не смог, ну да ладно

Для начала я определил IP клиента.
Так как сайт может лежать на сервере с двухуровневой системой(frontend и backend), то вероятно, что в стандартной переменной
$_SERVER['REMOTE_ADDR']может содержаться неправильный IP адрес клиента.

У меня на фронтенде стоит nginx и IP адрес он передает в переменную $_SERVER['HTTP_X_REAL_IP']

На всякий случай, я проверяю оба адреса.

Получим клиентские IP

$client_x_ip = $_SERVER['HTTP_X_REAL_IP'];
$client_ip = $_SERVER['REMOTE_ADDR'];

Функцию проверки IP адреса

Теперь создадим функцию проверки IP адреса.
Она будет запрашивать на сервере данные об IP клиента, из полученного результата доставать необходимые данные и выводить их удобным ассоциативным массивом.

function geoCheckIP($ip)
{
	   //запрашиваем данные у сервера
	   $response=@file_get_contents('http://www.netip.de/search?query='.$ip);

		// создаем шаблоны регулярных выражений
		// для поиска в результате от сервера необходимых
		// нам значений
	   $patterns = array();
	   $patterns['domain'] = '#Domain: (.*?) #i';
	   $patterns['country'] = '#Country: (.*?) #i';
	   $patterns['state'] = '#State/Region: (.*?)<br #i';
	   $patterns['town'] = '#City: (.*?)<br#i';

	   // массив, для сохраниения результата
	   $ip_info=array();

	   // достанем из страницы нужные нам данные
	   // о стране, городе, регионе и домене
	   foreach ($patterns as $key =/> $pattern)
	   {
			   // сохраняем в массив найденные значений, или пишем, что они не найдены
			    $ip_info[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'не найдено';
	   }

	   return  $ip_info;
}

Проверка IP

Теперь осталось просмотреть результаты, полученные от проверки каждого IP адреса, если они из США(короткий код US), то перенаправлеям пользователя на страницу с сообщением об ошибке, если же ни один их адресов не из США, то перенаправляем пользователя на запрошенную страницу.

$result = geoCheckIP($client_ip);

if(substr($result['country'],0,2) == 'US')
	$location = "error-page.html";
else
	$location = $_REQUEST['file'];

$result = geoCheckIP($client_x_ip);

if(substr($result['country'],0,2) == 'US')
	$location = "error-page.html";

И теперь сохраняем этот файл под именем check_ip.php и загружаем на сервер
И если надо запросить какой-либо файл с проверкой IP, то просто в ссылке подставляем такую конструкцию:

Если было: http://test.ru
то теперь в ссылке должно быть написано: check_ip.php?file=http://test.ru

Retweet

Похожие статьи

Комментарии

trawl
22 Mar, 2012в16:27

есть отечественный бесплатный сервис с API. ipgeobase.ru и через simplexml все легко разруливается

Дмитрий Андреев
12 Apr, 2012в09:11

Ну на тот момент, когда у меня стояла такая задача, я об этом сервисе не знал, спасибо за информацию.

Серж
12 May, 2012в08:16

trawl Плюсую! Отличный сервис

Оставить комментарий