18.10.2024 Уже прочитали 6469 раз

Как запретить доступ к сайту для иностранных IP адресов

Для того чтобы ограничить доступ к сайту на Битрикс только для пользователей из России, можно настроить ограничения на уровне веб-сервера, например, используя Apache или Nginx, а также геолокацию IP-адресов. Один из способов сделать это — с использованием модуля GeoIP либо если у вас используется Cloudflare, то можно настроить правила доступа через панель Cloudflare. Создайте правило для блокировки доступа для всех стран, кроме России.

Альтернативный способ (через PHP):

Если у вас есть доступ только к папке сайта на Битрикс, а конфигурацию веб-сервера (Apache или Nginx) изменить нельзя, вы можете использовать код проверки страны через php, тут важно учесть, что проверка должна выполняться до загрузки любых заголовков и основного контента сайта. Идеальное место для проверки — в самом начале файла header.php в шаблоне сайта, перед вызовами require() и любыми HTML или PHP конструкциями, которые выводят данные на страницу.

Код проверки с использование стороннего API для геолокации

Мы будем реализовать проверку страны с помощью PHP и API для определения геолокации на основе IP-адреса с помощью сервиса ipinfo.io, вот пример, как это можно сделать:

// Получаем текущий URL страницы
$request_uri = $_SERVER['REQUEST_URI'];

// Если это главная страница (URI == '/'), выводим заглушку
if ($request_uri == '/') {
    echo file_get_contents('https://адрес-сайта/access-denied.html');
    exit;
}

// Если не главная страница, проверяем IP
$ip = $_SERVER['REMOTE_ADDR'];

// URL для получения информации о стране
$api_url = "http://ipinfo.io/{$ip}?token=ВАШ_ТОКЕН"; // Регистрируемся на http://ipinfo.io/ и получаем токен, бесплатно у нас есть 50000 запросов

// Инициализация CURL для запроса
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

// Проверяем, был ли успешный ответ от API
if ($response === false) {
    echo 'Ошибка при получении данных о стране';
    exit;
}

// Декодируем JSON ответ
$data = json_decode($response, true);

// Получаем код страны из ответа
$country_code = $data['country'] ?? '';

// Если страна не Россия, выводим заглушку и прекращаем выполнение скрипта
if ($country_code !== 'RU') {
    echo file_get_contents('https://адрес-сайта/access-denied.html');
    exit;
}

Пояснение:

  1. CURL используется для запроса к API. Устанавливаются параметры, чтобы получить ответ в формате JSON.
  2. Ответ от API декодируется через json_decode, и извлекается код страны ($data['country']).
  3. Если страна не Россия (код страны не 'RU'), выводится заглушка.

Этот код будет работать без сохранения каких-либо данных о пользователе, каждый запрос будет проверяться заново.

Итог:

  • Пользователи с иностранным IP увидят заглушку access-denied.html, при этом URL в адресной строке останется неизменным (главная страница или любая другая).
  • Пользователи из России будут видеть обычный сайт.
Обратная связь

Материал был полезен?

Оценка помогает понимать, какие материалы стоит развивать и дополнять.

Обсудить задачу

Обратиться за помощью

Опишите задачу и оставьте контакты. Я посмотрю вводные и свяжусь с вами удобным способом.

Направление *