Мощные VPS/VDS-сервера на новейшем поколении процессоров Intel от 330р в месяц   •   Реклама
16 055 просм
73 комм
Поделиться:

Как заблокировать доступ к сайту по определенной стране или городу на 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-стили или скрипты и таким образом настроить нужное вам оформление для страницы блокировки.

Визуально итог работы нашего скрипта будет такой:

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

Предложенный код нужно вставлять в самый верх главного файла вашего проекта. Чаще всего это файл index.php, который находится в корневой (главной) папке вашего сайта.

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

include_once '/lock.php';

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

73
комментария
Форма комментирования этой статьи скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    1
      •  Пользователь
    13 сен в 13:39

    Артём приветствую!

    Мы работаем удаленно и нацелены на Европу.

    Сайт создан на Tilda.

    У меня вопрос:

    Как ограничить работу сайта в Тайланде ?

    Заранее благодарю

      • 0
      909
        •  Команда Pandoge
      17 сен в 10:48

      Garry, здравствуйте!

      Если я не ошибаюсь, функционал из статьи на Tilda не реализовать. Варианта два:

      1. Переносить сайт с Tilda, например, на CMS.

      2. Блокировать на JS (блокировку можно обойти). Пример - https://www.pandoge.com/moduli-i-skripty/kak-zablokirovat-dostup-k-saytu-po-opredelennoy-strane-ili-gorodu-na-javascript

    • 0
    7
      •  Проверенный
    30 июн в 20:44

    Артем, здравствуйте! Подскажите пожалуйста, как закрыть доступ к сайту со всех регионов России, кроме Москвы и Московской области, а так же закрыть доступ к сайту с других стран?

    Чтоб доступ был открыт только для регионов Москва и Московская область

      • 0
      909
        •  Команда Pandoge
      1 июл в 03:35

      Алексей, здравствуйте!

      Подскажите, какой сервис используете для получения данных о пользователе?

      • 0
      7
        •  Проверенный
      16 июл в 22:33

      Артём Мáлков, добрый день! Сделали все как написано, фильтр работает! Переходы с регионов и других стран ушли. Остались переходы только из Москвы и Области.

      Позиции по гуглу рухнули, яндекс я так понимаю может тоже в след за ним пойти. На сайт закуплены вечные ссылки с разных сайтов, в основном на региональных по всей России.

      Подскажите, это может быть связано с этим фильтром? Вместе с переходами мог отсеятся ссылочный вес?

      • 0
      909
        •  Команда Pandoge
      17 июл в 00:03

      Алексей, здравствуйте!

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

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

      Вариант проверки (не самый точный), что посетитель поисковой бот - https://www.pandoge.com/stati-i-sovety/kak-opredelit-chto-posetitel-vashego-sayta-poiskovyy-robot-a-ne-chelovek-na-php

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

      • 1
      7
        •  Проверенный
      17 июл в 14:24

      Артём Мáлков, сайт по гуглу как раз делся. Какие то позиции рухнули, а какие то вообще вылетели из индекса. С яндексом пока все нормально, но на сколько я понимаю, скоро может быть аналогичная ситуация, как и с гуглом. По другим поисковикам не смотрел.

      Попробуем внедрить вашу рекомендацию. На самом деле вы даете правильную рекомендацию, ссылочный вес считывает бот поисковой системы. У каждой поисковой системы несколько ботов, каждый из них отвечает за свою функцию, например, один читает текст, другой, картинки, третий ходит по ссылкам и т.д. Думаю, что дополнив фильтр доп.скриптом который вы порекомендовали, должно все нормализоваться.

      Если есть, что еще посоветовать, как лучше это сделать, буду вам признателен!

      Да и так, уже помогли, СПАСИБО!!!

      По результату обязательно отпишусь! Думаю все должно быть хорошо!

      • 0
      7
        •  Проверенный
      18 июл в 15:39

      Артём Мáлков, добрый день! Внедрили дополнительный скрипт для разрешения поисковым ботам посещать сайт, согласно вашей рекомендации. Повалил трафик из США и России, как это было ранее, до внедрения фильтра. Подскажите пожалуйста, что делать?

      • 0
      909
        •  Команда Pandoge
      19 июл в 00:41

      Алексей, вам спасибо, затронули интересную тему.

      • 0
      909
        •  Команда Pandoge
      19 июл в 01:36

      Алексей, здравствуйте! Можете показать код?

      • 0
      7
        •  Проверенный
      19 июл в 21:46

      Артём Мáлков, здравствуйте!

      После внедрения новой рекомендации для разрешения доступа к сайту поисковых ботов, опять пошел трафик из США, а так же отказной трафик из региона Россия. Напомню, обращался с просьбой помочь исключить трафик из России и оставить исключительно из Москвы и Московской области. Список поисковых ботов сделали меньше.

      Вот код:

      <?

      $botname = "";

      function is_Bot() {

      if(!isset($_SERVER["HTTP_USER_AGENT"])) {

      $_SERVER["HTTP_USER_AGENT"] = "";

      }

      $bots = array(

      "Google", "Yandex",

      "Mail.Ru", "Rambler", "Lighthouse"

      );

      foreach($bots as $bot) {

      if(stripos($_SERVER["HTTP_USER_AGENT"], $bot) !== false) {

      $botname = $bot; // Если это бот - его идентификатор

      return true;

      }

      }

      return false;

      }

      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,region');

      $user_info = unserialize($user_info); // Массив с данными об IP

      if(is_Bot()===false) {

      if($user_info['region'] != 'MOW' and $user_info['region'] != 'MOS') { // Проверяем регион посетителя

      // Устанавливаем 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();

      }

      }

      // записываем в файл все заходы, кроме заблокированных (позже заккоментировать)

      $stats = file_get_contents('stats.txt');

      $stats .= date('H:i:s') . ' - ' . $_SERVER['REMOTE_ADDR'] . '. useragent: ' . $_SERVER["HTTP_USER_AGENT"] ."\n";

      file_put_contents('stats.txt', $stats);

      ?>

      • 0
      909
        •  Команда Pandoge
      изменено 20 июл в 03:04

      Алексей, здравствуйте!

      Немного поправил код:

      <?php
      
      	header('Content-Type: text/html; charset=utf-8');
      
      	function isBot() {
      
      		if(!isset($_SERVER['HTTP_USER_AGENT'])) {
      
      			$_SERVER['HTTP_USER_AGENT'] = '';
      
      		}
      		
      		$bots = array(
      			'Google', 'Yandex', 'Mail.Ru', 'Rambler', 'Lighthouse'
      		);
      		
      		foreach($bots as $bot) {
      		
      			if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false) {
      			
      				return $bot;
      				
      			}
      			
      		}
      		
      		return false;
      
      	}
      
      	if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare
      
      		$user_ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
      
      	} else {
      
      		$user_ip = $_SERVER['REMOTE_ADDR'];
      
      	}
      
      	if(!isBot()) {
      
      		// Запросы к ip-api.com, только если это не боты
      
      		$user_info = file_get_contents('http://ip-api.com/php/'.$user_ip.'?fields=country,region');
      		
      		$user_info = unserialize($user_info); // Массив с данными об IP
      
      		if($user_info['region'] != 'MOW' && $user_info['region'] != 'MOS') { // Проверяем регион посетителя
      
      			// Устанавливаем 503 ответ от сервера (сервис недоступен)
      
      			@header('HTTP/1.1 503 Service Temporarily Unavailable');
      			@header('Status: 503 Service Temporarily Unavailable');
      
      			echo '
      
      				<!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>
      
      			';
      
      			die();
      
      		}
      
      	}
      
      	// записываем в файл все заходы, кроме заблокированных (позже заккоментировать)
      
      	$stats = file_get_contents('./stats.txt');
      
      	$stats .= date('H:i:s') . ' - ' . $user_ip . '. useragent: ' . $_SERVER["HTTP_USER_AGENT"] ."\n";
      
      	file_put_contents('./stats.txt', $stats);
      
      ?>

      Что показывает stats.txt? Какие там заголовки? Кто заходит на сайт в таком количестве?

      Ещё момент (цитата из статьи): Для этого мы воспользуемся сервисом «ip-api.com», который бесплатно (с ограничением в 45 запросов в минуту)...

      О чем это говорит? Что когда вы сделали больше 45 запросов за минуту - сервис не возвращает вам данные, то есть, условие

      if($user_info['region'] != 'MOW' && $user_info['region'] != 'MOS') {

      перестает работать на минуту, и так каждый раз.

      Какие варианты решения?

      1. Купить платный тариф в этом сервисе.

      2. Сменить сервис на другой (с другими лимитами).

      3. Использовать куки или IP + базу данных и на какое-то время запоминать посетителей, исключая тем самым повторные запросы к сервису гео.

      • 0
      7
        •  Проверенный
      20 июл в 13:08

      Артём Мáлков, с вами как то можно связаться?

      • 0
      909
        •  Команда Pandoge
      20 июл в 23:05

      Алексей, внизу сайта есть ссылки на соц сети

      • 0
      7
        •  Проверенный
      21 июл в 12:20

      Артём Мáлков, мне нужно доработать этот скрипт. Сейчас идут переходы из США, а переходы которые мне нужны, куда то пропали! Мне бы хотелось с вами обсудить по телефону, ватцап или телеграм. Я вам расскажу что мне надо. Соответственно за вознаграждение! Сейчас вернули все обратно, как это было изначально, когда позиции по гуглу рухнули. На тот момент по яндексу были улучшения. Т.е задача, чтоб были улучшения по яндексу, но и чтоб другие поисковые, гугл, рамблер, майл тоже работали.

      Последние дополнительные внедрения не сработали. Сработали по другим поисковым (гугл вернул позиции) , но не с яндексом. С яндексом ухудшилась ситуация, т.к. идут отказные переходы из США.

      • 0
      909
        •  Команда Pandoge
      22 июл в 00:29

      Алексей, напишите ваш ватсап через форму обратной связи.

    • 0
    1
      •  Пользователь
    6 фев в 19:06

    Здравствуйте Артем, у меня такой вопрос, могу ля я заблокировать доступ к сайту на территории РФ, при этом чтобы открывалась страница с информацией типа "Этот сайт не доступен на территории РФ" и ссылки на другой сайт, А для остальных пользователей, сразу открывался нужный сайт

      • 0
      909
        •  Команда Pandoge
      18 фев в 11:58

      Сергей Белокопытов, здравствуйте!

      Да, в статье как раз приведен этот пример.

    • 0
    1
      •  Пользователь
    5 дек в 20:10

    Здравствуйте. Подскажите, как реализовать, чтобы наоборот пропускать пользователей только из определённого региона? Например, чтобы могли зайти только пользователи из Белгородской области.

      • 0
      909
        •  Команда Pandoge
      изменено 18 фев в 11:57

      Алексей Козловский, здравствуйте!

      В скрипте часть:

      ?fields=country,city&lang=ru

      меняете на:

      ?fields=regionName&lang=ru

      и

      $user_info['country'] == 'Россия'

      на:

      $user_info['regionName'] != 'Белгородская область'
    • 2
    1
      •  Пользователь
    12 авг в 09:27

    Здравствуйте, подскажите пожалуйста, я гне очень разбираюсь в файлах сайта и не могу понять куда вставлять данный код, пролистал комментарии, говорят в header.php, но я его тоже не нашел. CMS Wordpress

    я изначально хочу заблокировать сайт для Казахстана, и у меня получится вот такой код -

    <?php

    header("Content-Type: text/html; charset=utf-8");

    $user_ip = $_SERVER['REMOTE_ADDR'];

    $access_key = 'KEY';

    $user_info = file_get_contents('http://api.ipstack.com/'.$user_ip.'?access_key='.$access_key.'');

    http://api.ipstack.com/81.211.220.174?access_key=9a3000989c050086c77b6597e2ef3400

    $user_info = json_decode($user_info);

    $user_country = $user_info->country_name;

    $user_city = $user_info->city;

    if($user_country == "Kazakhstan") { // Проверяем страну посетителя

    @header('HTTP/1.1 503 Service Temporarily Unavailable');

    @header('Status: 503 Service Temporarily Unavailable');

    echo <<<HTML

    Access denied

    <style>

    body {

    background: #f4f4f4;

    }

    </style>

    HTML;

    exit();

    }

    ?>

    Он верен? Заранее спасибо, я больше нигде не смог найти информации по данном теме в таком развернутом виде, и как оказалось даже такая информация для меня темный лес, а скрипт нужен((((

      • 0
      909
        •  Команда Pandoge
      изменено 18 фев в 11:52

      Alex West, здравствуйте!

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

      $user_ip = $_SERVER['REMOTE_ADDR'];
      
      $access_key = '9a3000989c050086c77b6597e2ef3400';
      
      $user_info = file_get_contents('http://api.ipstack.com/'.$user_ip.'?access_key='.$access_key);
      
      $user_info = json_decode($user_info);
      
      $user_country = $user_info->country_name;
      
      if($user_country == 'Kazakhstan') { // Проверяем страну посетителя
      
      	@header('HTTP/1.1 503 Service Temporarily Unavailable');
      
      	@header('Status: 503 Service Temporarily Unavailable');
      
      	echo <<<HTML
      
      		Access denied
      
      		<style>
      			body {
      				background: #f4f4f4;
      			}
      		</style>
      
      HTML;
      
      	exit();
      
      }

      Его вы вставляете в верх файла functions.php или index.php темы сайта.

    • 0
    1
      •  Пользователь
    6 мая в 11:51

    Артём здравствуйте! Сильно не пинайте, я во всем этом пока не силён, помогите пожалуйста, почитал все коменты но не понял как сделать.

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

    Подскажите как это сделать и куда этот получившийся код вставить.

    Очень и очень надо!

    Спасибо!

      • 0
      909
        •  Команда Pandoge
      18 фев в 11:27

      Евгений Б, здравствуйте!

      На какой CMS ваш сайт?

    • 0
    3
      •  Пользователь
    10 мая в 12:52

    Артем, подскажите, пожалуйста, а можно как-то закрыть часть страницы? Например, у меня на сайте стоит виджет ВК. Для пользователей с Украины он не отображается и сайт долго висит. Можно как-то сделать, чтобы всем, кроме Украины этот виджет отображался?

      • 0
      909
        •  Команда Pandoge
      11 мая в 01:15

      Павел, здравствуйте. Да, можно.

      Скажите какая CMS используется на сайте, подскажу как лучше можно сделать.

      • 0
      3
        •  Пользователь
      16 мая в 09:50

      Артем, использую DLE (Datalife Engine). Спасибо большое за помощь!

      • 0
      909
        •  Команда Pandoge
      20 мая в 01:56

      Павел, здравствуйте. Прошу прощения за поздний ответ.

      1. Подключаетесь к сайту по FTP.

      2. В папке /engine/modules/ создаете файл vk-widget.php. Сам файл заполните скриптом:

      <?php
      
      	/*
      	=====================================================
      	Автор: Артем Малков
      	-----------------------------------------------------
      	Назначение: Блокировка виджета VK
      	=====================================================
      	*/
      
      	if(!defined("DATALIFEENGINE")) {
      
        		die("Hacking attempt!");
      
      	}
      	
      	if(isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
      	
      		$user_ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
      
      	} else {
      
      		$user_ip = $_SERVER["REMOTE_ADDR"];
      	
      	}
      
      	$user_info = file_get_contents("http://ip-api.com/json/".$user_ip);
      	$user_info = json_decode($user_info);
      	$user_country = $user_info->country;
      
      	if($user_country != "Ukraine") {
      
      		echo <<<HTML
      
      			Здесь ваш полный код виджета от ВК
      
      HTML;
      
      }
      
      ?>

      Здесь ваш полный код виджета от ВК - замените на все скрипты от ВК.

      3. Далее, в шаблоне вашего сайта, в нужное место вставьте:

      {include file="engine/modules/vk-widget.php"}

      По необходимости очистите кэш сайта.

      • 0
      3
        •  Пользователь
      20 мая в 12:13

      Супер! Все работает! Спасибо вам огромное!

    • 2
    766
      •  Гости
    26 окт в 16:49

    Подскажите, возможно ли блокировать по региону? Скрипт работает через ip-api.com , заметил что там кроме страны и регион выдается. Попробовал заблокировать для пробы Калугу, но почему то не работает, хотя по стране продолжает блокировать. Сам скрипт такой:

    $user_ip = $_SERVER['REMOTE_ADDR'];

    $user_info = file_get_contents('http://ip-api.com/json/'.$user_ip);

    $user_info = json_decode($user_info);

    $user_country = $user_info->country;

    $user_region = $user_info->region;

    if($user_country == "Ukraine" || $user_region == "KLU")

      • 0
      909
        •  Команда Pandoge
      26 окт в 18:09

      Алексей, не совсем понял.

      Условие у Вас сейчас такое: если Украина или Калуга - блокируем.

      То есть блокировка происходит по любому из выполненных условий.

      Насчет этого: $user_region == "KLU"

      Ваш $user_region точно определяется как KLU?

      • 0
      766
        •  Гости
      26 окт в 18:35

      Артем, да все верно. С Украиной все работает, как надо.

      ip-api.com определяет $user_region как KLU, пробовал несколько прокси, думаю дело не в них. Также оставлял только одно условие с регионом, т.е. if($user_region == "KLU"), все равно почему то игнорирует условие. Пробовал делать не через region, а через regionName =="Kaluzhskaya oblast'", все равно пропускает. Кэш не забывал чистить перед каждой проверкой.

      • 0
      909
        •  Команда Pandoge
      14 янв в 02:25

      Алексей, а если вывести в коде

      var_dump($user_info);

      так же через прокси - что показывает?

      • 0
      766
        •  Гости
      26 окт в 19:31

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

      Выдало:

      bject(stdClass)#1 (14) { ["as"]=> string(24) "AS13335 Cloudflare, Inc." ["city"]=> string(17) "Frankfurt am Main" ["country"]=> string(7) "Germany" ["countryCode"]=> string(2) "DE" ["isp"]=> string(10) "Cloudflare" ["lat"]=> float(50.1153) ["lon"]=> float(8.6823) ["org"]=> string(10) "Cloudflare" ["query"]=> string(14) "162.158.90.140" ["region"]=> string(2) "HE" ["regionName"]=> string(5) "Hesse" ["status"]=> string(7) "success" ["timezone"]=> string(13) "Europe/Berlin" ["zip"]=> string(5) "60313" }

      Сайт через cloudflare работает и похоже при недоступности сайта он выдавал кэшированную версию файла страницы, ну или что-то в этом роде, пока не разобрался, но причину понял. Еще раз большое спасибо.

    • 0
    766
      •  Гости
    3 авг в 23:21

    Здравствуйте) Подскажите пожалуйста, установил этот скрипт, проверяю как на запрет доступа для России, так и запрет на все страны кроме России, при входе на сайт выдает ошибку HTTP ERROR 500 на любое из условий и текст предупреждения не выводится, что я не так сделал?)

      • 1
      909
        •  Команда Pandoge
      4 авг в 01:31

      Иван, в идеале - посмотреть бы на сайт и на код. И надо узнать, что Вам возвращает сервер при получении данных о пользователе.

    • 0
    766
      •  Гости
    13 июл в 12:28

    Привет, Артем! Я пытаюсь внедрить себе этот код в сайт, но сейчас «freegeoip.net» не работает, редиректит на ipstack.com/, просит регистрацию для получения АПИ ключа, зарегился, получил, сменил ссылку на

    $user_info = file_get_contents('http://api.ipstack.com/193.0.221.68?access_key=829e59d391b1338db09ded4ebce342d4&format=1'.$user_ip); не работает, пробовал другие сервисы.. тоже не работает(((

    Движок Опенкарт 2.3+

      • 0
      909
        •  Команда Pandoge
      13 июл в 15:40

      Max, а Вы увенены что не работает? Откройте ссылку в браузере - http://api.ipstack.com/193.0.221.68?access_key=829e59d391b1338db09ded4ebce342d4&format=1

      Ответ приходит.

      Обратите внимание, что IP пользователя подставляется в самое начало - /193.0.221.68?, а не в конец как у вас.

      • 0
      766
        •  Гости
      15 июл в 13:38

      Здравствуйте Артем, Схожая проблема как у Max. Пробовал подставить другие сервисы, а так же ipstack.com. Но результатов ни каких не было. До этого пользовался freegeoip.net все работала отлично. (Кстати спасибо вам за скрипт) . Но сейчас как-то не получается его запустить. Может быть у вас есть какие то аналоги? Делал тоже самое по сути как и мах касательно замены полей.

      • 0
      909
        •  Команда Pandoge
      16 июл в 12:52

      TT, мало просто заменить ссылку. Нужно посмотреть, что приходит от того или иного сервиса и переделывать под него код.

      На примере приведенного сервиса ip-api.com это буде выглядеть следующим образом:

      <?php

      header("Content-Type: text/html; charset=utf-8");

      $user_ip = $_SERVER['REMOTE_ADDR'];

      $user_info = file_get_contents('http://ip-api.com/json/'.$user_ip);

      $user_info = json_decode($user_info);

      $user_country = $user_info->country;

      $user_city = $user_info->city;

      echo "Ваша страна: ".$user_country."<br>Ваш город: ".$user_city;

      ?>

      • 0
      766
        •  Гости
      16 июл в 15:28

      Да, извините не указал это. Я проводил изменение полей $user_country = $user_info->country и $user_city = $user_info->city; а так же if($user_country == 'Russia') в соответствии с данными полей представленных в сервисах и подставлял их названия. Я так понимаю, этот скрипт предложенный выше должен показать вывод названия страны и города. Но даже при полном его копировании сайт начинает очень долго грузиться и не выдает названия ни города ни страны.=>"Ваша страна:

      Ваш город: " Или же если брать центральную его часть заменяя ранее содержимое кода он не выводит блокировку так же. Я все же еще поэкспериментирую с другими сервисами возможно я что то упустил из-за незнания. Благодарю вас. Если есть еще какие-то рекомендации и вам не сложно будет их дать я с радостью бы услышал.

      • 0
      909
        •  Команда Pandoge
      16 июл в 16:22

      Мне кажется, у вас проблемы с хостингом. Вот что мне выдал скрипт:

      Ваша страна: Russia

      Ваш город: Moscow

      Время выполнения: 0.12987089157104

      Это учитывая время его выполнения (то есть 1 доля секунды). Проверьте, что Вам возвращает:

      echo "Ваш IP: ".$_SERVER['REMOTE_ADDR'];

      • 0
      766
        •  Гости
      16 июл в 17:06

      Этот скрипт работает корректно вернуло мой ip. Кстати возможно какой то конфликт с http://ip-api.com/json. От того и долгая загрузка ибо с другими сервисами хоть и не работает но скорость загрузки не менялась.

      • 0
      909
        •  Команда Pandoge
      16 июл в 17:32

      TT, есть возможность предоставить доступы к Вашему хостингу? Проверю что к чему. Можно через комментарии.

      • 0
      766
        •  Гости
      16 июл в 17:33

      Удается выудить из скрипта только ip. Все остальные параметр игнорируются. В принципе если блокировать по названию страны не получиться . Можно ли создать диапазон всех ip адресов допустим РФ и при совпадении с массивом выдавать блокировку? Я использую этот код для блокирования отдельных новостей. Раньше скрипт работал пока сервис http://freegeoip.net/ не перестал работать.

      • 0
      909
        •  Команда Pandoge
      14 янв в 02:17

      TT, что в таком случае появляется на экране?

      <?php
      	
      	header("Content-Type: text/html;charset=utf-8");
      	
      	$user_ip = $_SERVER["REMOTE_ADDR"];
      	$user_info = file_get_contents("http://ip-api.com/json/".$user_ip);
      	
      	var_dump($user_info);
      	
      ?>
      • 0
      766
        •  Гости
      16 июл в 20:03

      Увы к хостингу доступ скорее всего не поучиться получить. Но вы уже достаточно помогли. Я примерно понял куда можно копать. Надеюсь что нибудь получиться сделать. Спасибо большое.

    • 0
    766
      •  Гости
    19 мая в 00:26

    "This API endpoint is deprecated and will stop working on July 1st, 2018. For more information please visit: https://github.com/apilayer/freegeoip#readme"

      • 0
      766
        •  Гости
      19 мая в 02:03

      <?php

      header("Content-Type: text/html; charset=utf-8");

      $user_ip = $_SERVER['REMOTE_ADDR'];

      $access_key = 'KEY';

      $user_info = file_get_contents('http://api.ipstack.com/'.$user_ip.'?access_key='.$access_key.'');

      $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();

      }

      ?>

    • 0
    766
      •  Гости
    13 мар в 14:14

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

      • 5
      909
        •  Команда Pandoge
      14 мар в 02:26

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

      Чуть позже выложу функцию по определению поисковых роботов.

      • 0
      766
        •  Гости
      15 мар в 10:35

      Артем, заранее спасибо, мне это очень интересно.

      • 0
      766
        •  Гости
      23 мар в 11:46

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

      • 1
      766
        •  Гости
      23 мар в 12:04

      И почему-то это не работает в опере, что с «турбо» что без

      • 5
      909
        •  Команда Pandoge
      14 янв в 02:05

      Ростислав, а что выводит

      echo $user_country;

      и

      echo $user_city;

      ?

      • 0
      766
        •  Гости
      23 мар в 12:50

      Спасибо за отзывчивость! Ниже приведён код который сейчас прописан в самом верху подключающегося на каждой странице header.php.

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

      <?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_code = $user_info->country_code;

      if($user_country !== 'Russia' || $user_code !== 'RU' ) {

      @header('HTTP/1.1 503 Service Temporarily Unavailable');

      @header('Status: 503 Service Temporarily Unavailable');

      echo "Запрос отклонён" , "$user_country";

      exit();

      }else {

      echo "$user_country";

      }

      ?>

      • 5
      909
        •  Команда Pandoge
      23 мар в 13:07

      Скопировал ваш код - все работает. Что у Вас за CMS? Анонимайзер через который проверяю - noblockme

      • 1
      766
        •  Гости
      23 мар в 13:21

      Артем, да, код в порядке, видимо я неправильно его вставляю. wordpress.

      Дело в том что я проверял работу будучи авторизованным как администратор, в то время как в других браузерах не авторизовался. Сейчас проверил, и получается когда я авторизован код выполняется, а без авторизации - нет. Не в тот header получается вставляю код. Хотя он срабатывал когда я просил знакомых из зарубежья проверить доступен ли сайт, странно.

      • 1
      766
        •  Гости
      23 мар в 14:04

      Прошу прощения, всё дело было в кэше. Спасибо за код! Жду с нетерпением способ отличать роботов, надо попробовать поискать, возможно у того же гугла есть свои постоянные айпишники и добавить их в условия.

    • 1
    766
      •  Гости
    6 фев в 12:41

    Не работает скрипт

      • 10
      909
        •  Команда Pandoge
      6 фев в 20:59

      влад, скрипт рабочий на 100%. Проверяйте корректность использования.

    • 0
    766
      •  Гости
    4 фев в 11:41

    у меня такой вопрос, у меня движок dle 12.0 и при загрузке фото появляется на ней надпись (DataLife Engine) как её убрать?

      • 5
      909
        •  Команда Pandoge
      4 фев в 14:30

      Сергей, У нас есть полезная статья на эту тему. Почитать можно здесь - https://www.pandoge.com/stati_i_sovety/nastroyka-vodyanogo-znaka-watermark-v-dle

    • 1
    766
      •  Гости
    1 фев в 22:45

    Здравствуйте!

    А как например, открыть доступ только для нескольких городов России, а для всех остальных закрыть?

    Например, закрыть для всех, кроме Москва и Санкт-Петербурга (города чисто для примера взял :-) )

      • 5
      909
        •  Команда Pandoge
      14 янв в 01:58

      Павел, На примере той же России.

      Если строка:

      if($user_country == "Russia") {

      делает запрет на Россию, то:

      if($user_country != "Russia") {

      запрещает всем, кроме России и так далее.

      • 0
      766
        •  Гости
      2 фев в 17:00

      Спасибо за ответ, а этот скрипт от роботов не закрывает индексацию?

      И второй вопрос по строке:

      if($user_country !== 'Russia') {

      если две страны, то как их правильно перечислить?

      • 5
      909
        •  Команда Pandoge
      14 янв в 01:58

      Павел, если IP робота относиться к запрещенному региону - то наверное запретит.

      Для двух:

      if($user_country != "Russia" || $user_country != "Ukraine") {

      и так далее.

      • 0
      766
        •  Гости
      3 фев в 22:09

      А $user_country и $user_city будут правильно работать для http://ipgeobase.ru ?

      Заметил, что этот сайт более стабильней определяет и работает.

      Или там другие переменные?

      • 10
      909
        •  Команда Pandoge
      4 фев в 02:15

      Павел, если я не ошибаюсь - этот сайт в принципе не предоставляет данные для скриптов. То есть, в данном случае код из статьи не будет работать.

      • 0
      766
        •  Гости
      7 сен в 17:19

      С функцией для определения робота что-нибудь известно?

      • 0
      909
        •  Команда Pandoge
      7 сен в 18:17

      Павел, что именно?

      • 0
      766
        •  Гости
      9 сен в 21:04

      Заметил, что freegeoip.net теперь редиректит на другой сайт, и не определяет город.

      А для https://ipinfo.io другой код?

      По роботам известно, как их не запретить?

      • 1
      909
        •  Команда Pandoge
      10 сен в 13:42

      Павел, для того, чтобы адаптировать код - просто смотрите что возвращает сервер и делайте по аналогии с примером.

      Что касается роботов - внедряйте эту функцию https://www.pandoge.com/stati_i_sovety/kak-opredelit-chto-posetitel-vashego-sayta-poiskovyy-robot-a-ne-chelovek-na-php

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