Приветствую тебя, %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. Прошу прощения за некоторую косноязычность