Артём Мáлков

Как ограничить доступ к сайту/элементу для определенной страны или города на PHP?

18 фев3 комм

Бывает так, что по какой-то причине вам потребовалось заблокировать доступ к вашему сайту (или отдельному его элементу) тому или иному городу, стране. Эта необходимость может возникнуть при обнаружении подозрительного трафика (активности) из определенных стран (городов), локальном предоставлении тех или иных услуг и прочее. Задачи перед вами могут стоять абсолютно разные, я же сегодня покажу, как именно можно их решить.

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

Как вы понимаете, чтобы заблокировать посетителю сайта доступ по его стране или городу, эту (его) страну или город сначала нужно определить. Как это можно сделать, вы найдете в этом посте.

Далее, на самом деле, всё просто: по примеру из того же поста мы составляем условие и в случае его выполнения заблокируем загрузку основного содержимого сайта с выводом соответствующего сообщения.

Простой пример на PHP (функцию возьмете из поста выше) выглядит следующим образом:

header('Content-Type: text/html; charset=utf-8'); // Установим кодировку страницы 

/*

	Здесь должна быть функция из поста https://www.pandoge.com/post/756

*/

$getUserGeo = getUserGeo();

if($getUserGeo['status'] == 'success') { // Если получили данные от сервиса

	if($getUserGeo['country'] != 'Russia') { // Если посетитель не из России
	
		// Устанавливаем 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();


	}

} else { // Если НЕ получили данные от сервиса

	/* 

		Выполняем нужное действие, например, отправляем уведомление на почту.
		В нашем случае - просто остановка скрипта.

	*/ 

	die();

}

В общем случае (так скажем, для быстрого старта) данный скрипт нужно вставлять в самый верх главного файла вашего проекта. Чаще всего это файл index.php, который находится в корневой (главной) папке сайта. Я же рекомендую делать это, учитывая особенности используемой CMS. Если у вас сомнения с тем, куда же именно вставить этот код – пишите в комментариях, постараюсь вам помочь.

Для экономии места и поддержания чистоты кода проекта скрипт блокировки можно вынести в отдельный файл и подключить в том же месте (верх файла index.php) через:

include_once './lock.php';

Где «./lock.php» – название скрипта и путь до него на вашем хостинге.

Что касается сообщения о блокировке, визуально оно выглядит так:

Как ограничить доступ к сайту/элементу для определенной страны или города на PHP?

Изменить его можно, внеся правки между:

echo <<<HTML

	… 

HTML;

Здесь можно использовать любые HTML-теги, CSS-стили или скрипты, всё как при обычной верстке.

Скрытие/показ части (элемента) сайта для определенной страны или города

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

Здесь, как и в варианте с полной блокировкой, мне трудно дать вам универсальное решение, поскольку каждая CMS имеет свои рекомендации по внедрению подобного рода кода, поэтому я покажу вам реализацию на примере CMS WordPress, а решения для остальных CMS по вашему запросу мы перенесем в комментарии.

1. Функцию определения геопозиции (напоминаю, найти её вы сможете здесь) вы вставляете в конец файла functions.php темы вашего сайта.

2. Далее (в теме сайта) оборачиваем нужный блок (элемент) в подобного рода условие:

<?php

	$getUserGeo = getUserGeo();

	if($getUserGeo['status'] == 'success'): // Если получили данные

		if($getUserGeo['country'] == 'Russia'): // Если посетитель из России

?>
			
			Необходимое содержимое для посетителей из России

<?php

		endif;

	endif;

?>

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

<?php

	$getUserGeo = getUserGeo();

	if($getUserGeo['status'] == 'success'): // Если получили данные

		if($getUserGeo['country'] == 'Russia'): // Если посетитель из России

?>
			
			Необходимое содержимое для посетителей из России
			
<?php

		else:

?>

			Необходимое содержимое для посетителей НЕ из России

<?php

		endif;

	endif;

?>

Здесь я составил условие: если посетитель из России – показываем одно содержимое, в противном случае – другое.

В качестве содержимого могут быть рекламные блоки (РСЯ, Google Adsense и других), тексты, изображения и другие, как такового ограничения здесь нет.

Рекомендуем к просмотру
Получение местоположения (геопозиции) пользователя по IP-адресу на PHP+API
Посты
Как отобразить IP-адреса посетителей в «Яндекс.Метрике» на PHP?
Хаки
Идея для хорошего антиспама (теория)
Статьи и советы
3
комментария
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 2
    1
      •  Пользователь
    21 июл в 15:45

    Здравствуйте, а можете описать решение для csm DLE чтоб скрывать доступ к сайту/элементу?

      • 2
      1066
        •  Команда Pandoge
      22 июл в 11:47

      Сергей Петрович, здравствуйте! Какая у вас версия DLE?

    • 4
    1066
      •  Команда Pandoge
    11 июл в 14:38

    Все комментарии удалены в связи с обновлением поста.

Подняться наверх
«Pandoge» - помощник вебмастера