我想动态地将一些 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
)。