Черный список 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

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

Спасибо

0
задан 12 May 2020 в 12:15
1 ответ

Проблема в том, что 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).

0
ответ дан 12 May 2020 в 09:51

Теги

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