Как запретить доступ к сайту по критерию принадлежности к стране?

Приветствую тебя, %username%.

Вводные данные:
Есть некий ресурс (с доступом для клиентов только по http). На ресурсе хранятся различные, включая довольно таки объемные файлы (условно - дистрибутивы, как на http://mirror.yandex.ru/). Используется услуга хостинга (не VDS), на борту Apache1.3 и php5.3. Листинг файлов выводится апачем. Крайнее время сильно возросло количество запросов к серверу, и он стал не выдерживать нагрузок. В среднем - 3..10 запросов в секунду.

Необходимо:
Разграничить доступ. Запретить доступ всем, скажем, кроме "РФ" и стран ближнего зарубежья (очень много запросов стало как раз "из-за бугра").

Предполагаемое решение:
Использовать php для определения страны клиента (реализовано) + "прозрачно разрулить" доступ к файлам. Перенаправить все запросы к php:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^([^\.]+)$ check.php?url=$1 [L,QSA,NC]
</IfModule>

check.php получает в GET строку запроса, плюс там же мы проверяем IP. После обработки мы определились что делать с запросом (выяснили страну сверив IP с гео-базой) - пропустить его или заблокировать - но как теперь "вернуть управление" обратно?
Т.е. если запрос с IP "РФ", и запрошен корень сайта - нужно просто вывести индекс корня сайта; если запрос с IP "РФ", и запрошен файл - необходимо его отдать по прямой ссылке, по которой он и был раньше, не меняя url.
Если запрос с IP не "РФ" и стран ближнего зарубежья, и запрошен корень сайта - нужно отправить заголовок 403 и вывести вывести соответствующую ошибку; если запрошен файл по прямой ссылке - нужно сообщить ту-же самую 403 ошибку.

По идее можно было бы:
Если ip разрешен - делать header('Location: '.@$_GET['url'].'?redirect=no');, а в .htaccess добавить RewriteCond %{QUERY_STRING} !(^|&)redirect=no($|&) (а если запрещен - редиректить с заголовком 403 кода на страницу-заглушку), но это повлечет за собой редирект (которого надо избежать), и невозможность вывода индекса директорий.

Есть ли возможность сделать работу php "прозрачной"? Т.е. apache чтоб работал как работал, но в случае если ip клиента в "черном списке" - закрыть доступ?

ps. Прошу прощения за некоторую косноязычность
  • Вопрос задан
  • 6066 просмотров
Решения вопроса 2
Прошу прощения, я не уверен, что знаю, как это сделать с использованием голого apache и .htaccess, но почему бы вам не использовать nginx, собранным с одним из многочисленных модулей GeoIP ?
Во-первых nginx лучше справляется со статикой, и вероятно, нагрузка упадет сразу после внедрения nginxa в качестве фронта, и не будет такой острой нужды резать пользователей по регионам, а во вторых в nginx это реализуется достаточно просто:
К примеру, используя модуль geoip2, вы можете при помощи стандартной конструкции if в локейшнах nginx'a сравнивать значение переменной $region с нужными вам для запрета/разрешения.

Прошу прощения, если сочтете мой ответ офтопом.
Ответ написан
paramtamtam
@paramtamtam Автор вопроса
В общем, друзья, решение. Спасибо всем откликнувшимся!

Можно сэмулировать заботу php в "прозрачном режиме". Можно, но это очень ресурсоемко. В 2х словах алгоритм должен выглядеть следующим образом - все запросы перенаправляются к index.php; Если запрашиваем существующую директорию - выводим листинг; если запрашиваем файл - по кускам его читаем и выдаем (предварительно выставив необходимые заголовки). Но, т.к. запросов много, а файлы - довольно большие - решение бы положило сервер минуты за две. Работало бы, было бы гибкое, но положило. Очень хреновое решение в данной ситуации, надо сказать.

Что было сделано - так как хостинг от "руцентра" (nic.ru) - режим работы был переведен в ручной, собран из исходников модуль mod_geoip, и подсунут апачу из не "родной" директории (родные все ридонли). Апач его съел, модуль был настроен, всё заработало. Родной "мануал" на форуме "руцентра" крайне не полный, сделал о всем процессе заметку по ссылке. Саппорт руцентра так и не ответил на письма. Шли третьи сутки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@j_wayne
Учтите еще, что определение страны по IP имеет не 100% точность (возможны всякие варианты) и тут надо хорошо все взвесить - насколько допустимы ложные отказы для вполне валидных пользователей и т.п.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы