Бот-информер доступности сайта   •   Магазин расширений
2 228 просм
22 комм
Поделиться:

Как заблокировать доступ к сайту по определенной стране или городу на PHP?

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

Чтобы заблокировать доступ к сайту для определенной страны или города, первое, что вам необходимо сделать – это получить 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?

Сам код нужно вставлять в самый верх темы вашего сайта, либо же подключать его через:

<?php include_once("/lock.php")?> 

Где «/lock.php» – название скрипта и полный путь до него на вашем хостинге. Для проверки работы скрипта посетите свой сайт через какой-нибудь анонимайзер, который предоставляет выбор страны, или же воспользуйтесь прокси-сервером.

22
комментария
Навигация:
1 2
Павел
1.02 в 22:45
Здравствуйте!
А как например, открыть доступ только для нескольких городов России, а для всех остальных закрыть?
Например, закрыть для всех, кроме Москва и Санкт-Петербурга (города чисто для примера взял :-) )
  • 0
Павел, На примере той же России -

Если строка if($user_country == 'Russia') { - делает запрет на Россию, то:

if($user_country !== 'Russia') { - запрещает всем кроме России и так далее.
  • 5
Павел
2.02 в 17:00
Спасибо за ответ, а этот скрипт от роботов не закрывает индексацию?
И второй вопрос по строке:
if($user_country !== 'Russia') {
если две страны, то как их правильно перечислить?
  • 0
Павел, если IP робота относиться к запрещенному региону - то наверное запретит.

Для двух - if($user_country !== 'Russia' || $user_country !== 'Ukraine') { и так далее.
  • 5
Павел
3.02 в 22:09
А $user_country и $user_city будут правильно работать для http://ipgeobase.ru ?
Заметил, что этот сайт более стабильней определяет и работает.
Или там другие переменные?
  • 0
Павел, если я не ошибаюсь - этот сайт в принципе не предоставляет данные для скриптов. То есть, в данном случае код из статьи не будет работать.
  • 10
Сергей
4.02 в 11:41
у меня такой вопрос, у меня движок dle 12.0 и при загрузке фото появляется на ней надпись (DataLife Engine) как её убрать?
  • 0
Сергей, У нас есть полезная статья на эту тему. Почитать можно здесь - https://www.pandoge.com/stati_i_sovety/nastroyka-vodyanogo-znaka-watermark-v-dle
  • 5
влад
6.02 в 12:41
Не работает скрипт
  • -1
влад, скрипт рабочий на 100%. Проверяйте корректность использования.
  • 10
Ростислав
13.03 в 14:14
Спасибо за скрипт. Не подскажете, как добавить в исключения иностранные поисковые машины. Например доступ к сайту установлен только для России, но у нас пользуются не только Яндексом а и Гуглом, как минимум.
  • 0
Ростислав, для этого - вам нужно определить что посетитель вашего сайта - робот, и если это так - не использовать для него этот скрипт.

Чуть позже выложу функцию по определению поисковых роботов.
  • 5
Ростислав
15.03 в 10:35
Артем, заранее спасибо, мне это очень интересно.
  • 0
Ростислав
23.03 в 11:46
Никак не пойму почему это не срабатывает с анонимайзерами. Когда в скрипте указан доступ только для РФ, я захожу под немецким ип и сайт успешно загружается.
  • 0
Ростислав
23.03 в 12:04
И почему-то это не работает в опере, что с «турбо» что без
  • 0
Оставить комментарий:
Нажимая кнопку «Отправить» вы даете согласие на обработку своих персональных данных.
Ваше Имя
Ваш E-mail
Текст комментария