Я хотел на лету занести в черный список какой-нибудь 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
).