Блокировка доступа к сайту по определенной стране или городу

Блокировка доступа к сайту по определенной стране или городу

Бывает, что по какой-то причине нужно ограничить доступ к сайту тому или иному городу, стране. Например, сайт имеет, по большей части, контент на русском языке, и вдруг вы замечаете подозрительный трафик из Китая, который сильно тормозит работу вашего сайта. Чтобы заблокировать доступ к сайту для определенной страны или города, первое, что вам необходимо сделать – это получить IP пользователя, после чего получить необходимую информацию по нему, сделать проверку и в случае совпадения – заблокировать доступ. А теперь перейдем от слов к практике.


Думаю, что не стоит напоминать, что на вашем сайте должна быть поддержка PHP.

1. Начинаем писать наш мини-модуль блокировки. Воспользуемся суперглобальным массивом $_SERVER, который поможет определить IP адрес пользователя:
<?php
	header("Content-Type: text/html; charset=utf-8");
	$user_ip = $_SERVER['REMOTE_ADDR'];
?>

2. На основе полученного IP необходимо определить, откуда наш посетитель. Для этого мы воспользуемся сервисом freegeoip.net, который бесплатно, на основе IP, предоставит нам некоторую информацию о пользователе.
<?php
	header("Content-Type: text/html; charset=utf-8");
	$user_ip = $_SERVER['REMOTE_ADDR'];
	$user_info = file_get_contents('http://freegeoip.net/json/'.$user_ip);
	$user_info = json_decode($user_info);
	$user_country = $user_info->country_name;
	$user_city = $user_info->city;
?>

Здесь $user_country и $user_city содержат в себе название страны и города соответственно, которые указаны на английском языке.

На момент написания статьи сервис freegeoip был в рабочем состоянии. Если вдруг он перестал работать, воспользуйтесь следующими сервисами для получения информации о пользователе:
http://ipinfo.io 
http://xhanch.com/xhanch-api-ip-get-detail/ 
http://geoiplookup.net/ 
http://ip-api.com 
http://ipinfodb.com 

Обратите внимание, что при использовании этих сервисов необходимо внести корректировки в код.

3. Теперь сделаем проверку страны и заблокируем доступ, если страна совпала с указанной вами. На примере России итоговый скрипт будет выглядеть так:
<?php
	header("Content-Type: text/html; charset=utf-8");
	$user_ip = $_SERVER['REMOTE_ADDR'];
	$user_info = file_get_contents('http://freegeoip.net/json/'.$user_ip);
	$user_info = json_decode($user_info);
	$user_country = $user_info->country_name;
	$user_city = $user_info->city;
	if($user_country == 'Russia') { // Проверяем страну посетителя
		@header('HTTP/1.1 503 Service Temporarily Unavailable');
		@header('Status: 503 Service Temporarily Unavailable');
   
		echo <<<HTML
		Извините, но для Вашей страны заблокирован доступ к нашему сайту =(
		<style>
			body {
				background: #f4f4f4;
			}
		</style>
		HTML;
		exit();
	}
?>

Между
echo <<<HTML 
… 
HTML; 

вы можете указать любые HTML-теги, CSS-стили или скрипты и таким образом настроить нужное вам оформление для страницы блокировки. Визуально итог работы нашего скрипта будет такой, как на картинке к этой статье.

Сам код нужно вставлять в самый верх темы вашего сайта, либо же подключать его через:
<?php include_once("/lock.php")?> 

Где /lock.php – название скрипта и полный путь до него на вашем хостинге. Для проверки работы скрипта посетите свой сайт через какой-нибудь анонимайзер, который предоставляет выбор страны, или же воспользуйтесь прокси-сервером.
 
Кодировка: utf-8
Автор: Артем Мáлков
Источник
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.