Apache 2.2 IP 地址黑名单

Apache 2.2 IP 地址黑名单

我想动态地将一些 IP 地址列入黑名单。我正在更新主 httpd.conf,但我想动态地添加一些 IP,而不使用 .htaccess(也不使用繁重的 fail2ban)。因此,我使用 Rewrite map 创建了一个 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 内部服务器错误。”

但已经有一个 403 错误页面可以正常工作(位于 /var/www/htdocs/error.php),我试图将定义移出网站其余部分正常工作的部分,除了这个新设置

ErrorDocument 403 /error.php

或者

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

都不起作用,也就是说,我仍然有 500 内部服务器错误

知道我错在哪里吗?

谢谢

答案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条指令是正确的:由于文档由虚拟主机提供服务,因此它必须相对于 webroot(即它应该是/error.php,而不是/var/www/htdocs/error.php)。

相关内容