Как заблокировать доступ к сайту по определенной стране или городу на PHP?
Бывает, что по какой-то причине вам нужно ограничить доступ к вашему сайту тому или иному городу, стране. Например, ваш сайт имеет, по большей части, контент на русском языке, и вдруг вы замечаете подозрительный трафик из Китая, который сильно тормозит работу вашего сайта.
Чтобы заблокировать доступ к сайту для определенной страны или города, первое, что вам необходимо сделать – это получить IP пользователя, после чего получить необходимую информацию по нему, сделать проверку и в случае совпадения – заблокировать доступ.
А теперь от слов к практике.
Думаю, что не стоит напоминать, что на вашем сайте должна быть поддержка PHP.
1. Начинаем писать наш мини-модуль блокировки. Воспользуемся суперглобальным массивом «$_SERVER», который поможет вам определить IP адрес пользователя:
if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare
$user_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
$user_ip = $_SERVER['REMOTE_ADDR'];
}
2. На основе полученного IP необходимо определить, откуда наш посетитель. Для этого мы воспользуемся сервисом «ip-api.com», который бесплатно (с ограничением в 45 запросов в минуту), на основе переданного IP, предоставит нам некоторую нужную информацию о пользователе.
if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare
$user_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
$user_ip = $_SERVER['REMOTE_ADDR'];
}
$user_info = file_get_contents('http://ip-api.com/php/'.$user_ip.'?fields=country,city&lang=ru');
$user_info = unserialize($user_info); // Массив с данными об IP
/*
Доступные данные:
$user_info['country'] - страна
$user_info['city'] - город
*/
На момент написания статьи сервис «ip-api» был в рабочем состоянии. Если вдруг он перестал работать, воспользуйтесь следующими сервисами для получения информации о пользователе:
https://ipinfo.io
http://geoiplookup.net
https://ipwhois.io/ru/
http://ipinfodb.com
https://www.myip.com/api-docs/
https://geo.ipify.org
https://ipinfodb.com/api
https://freegeoip.app
Обратите внимание, что при использовании этих сервисов, в некоторых случаях, необходимо получение персонального ключа доступа и корректировки в предложенный код.
3. Теперь сделаем проверку страны и заблокируем доступ, если страна совпала с указанной вами. На примере России итоговый скрипт будет выглядеть так:
header('Content-Type: text/html; charset=utf-8'); // Установим кодировку страницы
if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare
$user_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
$user_ip = $_SERVER['REMOTE_ADDR'];
}
$user_info = file_get_contents('http://ip-api.com/php/'.$user_ip.'?fields=country,city&lang=ru');
$user_info = unserialize($user_info); // Массив с данными об IP
/*
Доступные данные:
$user_info['country'] - страна
$user_info['city'] - город
*/
if($user_info['country'] == 'Россия') { // Проверяем страну посетителя
// Устанавливаем 503 ответ от сервера (сервис недоступен)
@header('HTTP/1.1 503 Service Temporarily Unavailable');
@header('Status: 503 Service Temporarily Unavailable');
echo <<<HTML
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Сайт временно недоступен</title>
<style>
body {
padding: 0;
margin: 0;
background: #f4f4f4;
}
h1 {
color: #333;
text-align: center;
font-size: 22px;
font-weight: 400;
padding: 30px 0 0 0;
}
</style>
</head>
<body>
<h1>Извините, но для Вашей страны заблокирован доступ к нашему сайту =(</h1>
</body>
</html>
HTML;
die();
}
Между
echo <<<HTML
…
HTML;
вы можете указать любые HTML-теги, CSS-стили или скрипты и таким образом настроить нужное вам оформление для страницы блокировки.
Визуально итог работы нашего скрипта будет такой:

Предложенный код нужно вставлять в самый верх главного файла вашего проекта. Чаще всего это файл index.php, который находится в корневой (главной) папке вашего сайта.
Для экономии места и поддержания чистоты кода проекта, скрипт блокировки можно вынести в отдельный файл и подключить в том же месте (верх файла index.php) через:
include_once '/lock.php';
Где «/lock.php» – название скрипта и путь до него на вашем хостинге. Для проверки работы скрипта посетите свой сайт через какой-нибудь анонимайзер, который предоставляет выбор страны, или же воспользуйтесь прокси-сервером.