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