Как заблокировать сайт/показать разный контент, для разных стран?

Share

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

Определить регион пользователя можно только по его IP-адресу, а далее используя специальные базы — определить страну или город. Хорошим примером такой базы есть SypexGeo, её мы и будем использовать дальше. Итак, разберем алгоритм действий:

1. Скачать скрипт и базы SypexGeo (здесь)

Чтобы узнать страну нам необходимо скачать скрипт «Sypex Geo для PHP 5.2+» (он используется всегда) и базу Sypex Geo Country. А после залить их в корень сайта или в ту директорию с которой вы будете использовать.

2. Определить IP пользователя

Для вычисление IP можно использовать следующую функцию:

function getIP() {
    $array_ip_var = array('HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED', 'HTTP_VIA', 'HTTP_X_COMING_FROM', 'HTTP_X_COMING_FROM', 'HTTP_COMING_FROM', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'HTTP_PROXY_CONNECTION', 'REMOTE_ADDR');
    foreach($array_ip_var AS $var) { // обход массив с индексами
        $ip = $_SERVER[$var];
        if(isset($ip) && $ip != '127.0.0.1') { // если IP существует и отличный от стандартного, возвращаем его
            return $ip;
        }
    }

    return false;
}

В функции использовано несколько индексов для определения IP, это обусловлено тем, что REMOTE_ADDR не всегда возвращает правильное значение.

3. Узнать страну

Для определения страны используется следующий код

include_once "SxGeo.php"; // подключаем загруженный файл
$SxGeo = new SxGeo();
$ip = getIP(); // определяем IP-пользователя
$country = $SxGeo->getCountry($ip); // результат будет в формате Alpha-2 ISO 3166

Страну узнали, теперь можем проводить необходимые операции.

Пример. Блокировка сайта.  Чтобы заблокировать сайт, допустим, для России и Украины необходимо скачать SxGeo (пункт 1), залить скачанные файлы (SxGeo.php и SxGeo.dat) в корень сайта. Далее в index.php, в самом начале, после «<?php» добавить следующий код

include_once("SxGeo.php"); 
$SxGeo = new SxGeo();
$ip = getIP();
$country = $SxGeo->getCountry($ip);

$country_blocked = array(
    'RU',
    'UA',
    /* аналогичным образом добавляем и другие необходимые страны */
);

if(in_array($country, $country_blocked)) {
    echo "Blocked ...";
    die();
}

Все готово, теперь вместо обычной страницы сайта, пользователю будет показываться сообщение «Blocked …».