Назад | Перейти на главную страницу

Черный список IP-адресов Apache 2.2

Я хотел на лету занести в черный список какой-нибудь IP-адрес. Я обновляю основной httpd.conf, но я хотел добавить несколько IP-адресов на лету, без использования .htaccess (ни тяжелого fail2ban). Итак, я создаю список ip, используя карту перезаписи. Он работает хорошо, за исключением случаев, когда я хочу вывести ошибку 403.

Вот код, который работает:

<VirtualHost x.x.x.x:80>
RewriteEngine on
RewriteMap hosts-deny "txt:/var/www/htdocs/.deny"
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" ^-$ [NC] 
RewriteRule   .* /var/www/htdocs/error.php [L]

но для меня было бы больше смысла иметь это таким образом, что означает создание ошибки 403:

<VirtualHost x.x.x.x:80>
RewriteEngine on
RewriteMap hosts-deny "txt:/var/www/htdocs/.deny"
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" ^-$ [NC] 
RewriteRule   .* - [L,F]

но затем он придумал следующую ошибку: «У вас нет разрешения на доступ к /index.php на этом сервере». Кроме того, при попытке использовать ErrorDocument для обработки запроса произошла ошибка 500 Internal Server Error ».

но уже есть страница с ошибкой 403, которая работает (находится там /var/www/htdocs/error.php), я попытался переместить определение за пределы раздела, в котором оно работает для остальной части сайта, за исключением эта новая установка

ErrorDocument 403 /error.php

или

ErrorDocument 403 /var/www/htdocs/error.php

никто не работает, то есть у меня все еще есть внутренняя ошибка сервера 500

Есть идеи, где я ошибаюсь?

Спасибо

Проблема здесь в том, что ErrorDocument должен быть доступен для клиента. Вы должны вставить специальное правило, разрешающее загрузку этого одного файла, чтобы не получить внутреннюю ошибку. Что-то вроде этого должно получиться:

RewriteEngine on
RewriteMap hosts-deny "txt:/var/www/htdocs/.deny"
RewriteCond   %{REQUEST_URI} !^/error.php$
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" ^-$ [NC] 
RewriteRule   .* - [L,F]

Это также означает, что первый ErrorDocument директива правильная: поскольку документ обслуживается виртуальным хостом, он должен быть относительно корневого веб-узла (т.е. он должен быть /error.phpне /var/www/htdocs/error.php).