我最初将此发布在webmasters.stackexchange.com上,但被告知我在这里会得到更好的接待。
在过去的几天里,我一直在遭受似乎是(可能是无意的)DDOS 攻击。我收到了很多来自标识为“Mozilla/4.0(兼容;ICS)”的代理的请求,以至于 apache 占用了所有可用内存。
因此,我想阻止此用户代理伴随的所有请求,所以我尝试在 httpd.conf 中这样做:
SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user
但是当我重新启动 apache 时,它会抱怨在deny
这里使用。无需将其包装在 alocation
或directory
块中,这意味着我必须为每个站点添加一个新块,有什么方法可以拒绝对整个服务器的访问?
更新:我得到的错误
- 重新启动 Web 服务器 apache2
/etc/apache2/httpd.conf 的第 4 行出现语法错误:此处不允许拒绝 [fail]
现在看起来像是一个老问题,但我想做同样的事情并从上面的神经中找到了答案。它不是很正确 - 在我看来它应该是
<Location "/">
,并且SetEnvIf
需要一个正则表达式所以括号需要被引用。这对我来说适用于在所有虚拟主机上应用访问控制:
只需在 vhost 定义之前包含它。
mod_rewrite 可以根据文档在服务器级别进行配置:
不要忘记转义正则表达式
RewriteCond
如果 SetEnv 行上的语法是正确的,您应该能够像这样在 conf 中抛出它:
应该允许它在所有虚拟主机上运行——刚刚在 2.2.24 上测试过,效果很好。