有人向我的 Apache 服务器的 80 端口发送了一堆垃圾数据,导致出现大量 400 Bad Request 错误。遗憾的是,我对此无能为力,但我至少可以阻止它填满我的日志吗?我找不到根据 If、SetEnvIf 或 mod_rewrite 中的状态代码进行过滤的方法。
答案1
就您而言,您希望根据查询的响应进行条件日志记录。大多数条件日志记录(例如按 IP 或 URL 路径)都是根据请求进行操作的。
在 httpd 2.4 之前,您可能会执行以下操作以根据请求中的数据不记录某些请求。
例如。
SetEnvIf Request_URI "^/wpad.dat(.*)$" noise
SetEnvIf Request_URI "^/favicon.ico$" noise
CustomLog access_log combined env=!noise
但是,使用 SetEnvIf 仅适用于基于请求的过滤。我们需要一个环境变量(在 Apache httpd 环境中)来为我们提供响应代码,因为 CustomLog 会在请求结束时进行处理。
在 httpd 2.4 中,我们还有更灵活的“表达式”构造,因此 CustomLog 可能具有“env=xxx”或“expr=xxx”
从http://httpd.apache.org/docs/current/mod/mod_log_config.html
“第三个参数是可选的,用于控制是否记录特定请求。条件可以是服务器环境中特定变量的存在或不存在(在‘env=!name’子句的情况下)。”
所以你的问题实际上可以归结为:“是否有一个 httpd 环境变量可以为我提供针对请求生成的响应代码”
看:Apache 环境变量列表? 和:https://httpd.apache.org/docs/2.4/expr.html#vars
从文档本身来看:
# Conditional logging
CustomLog logs/access-errors.log common "expr=%{REQUEST_STATUS} >= 400"
CustomLog logs/access-errors-specific.log common "expr=%{REQUEST_STATUS} -in {'405','410'}"
答案2
LogLevel 允许您设置错误日志中问题的严重性。CustomLog 允许您编辑访问日志中显示的内容。
看https://httpd.apache.org/docs/1.3/logs.html#errorlog以及其中的链接来找到针对您的确切问题的解决方案,因为目前还不清楚您当前正在谈论哪个日志
条件记录 有时,根据客户端请求的特征从访问日志中排除某些条目会很方便。这可以通过环境变量轻松实现。首先,必须设置环境变量以指示请求满足某些条件。这通常使用 SetEnvIf 来实现。然后,使用 CustomLog 指令的 env= 子句来包含或排除设置了环境变量的请求。以下是一些示例:
# Mark requests from the loop-back interface:
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file:
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains:
CustomLog logs/access_log common env=!dontlog
再举一个例子,考虑将英语使用者的请求记录到一个日志文件,将非英语使用者的请求记录到另一个日志文件。
SetEnvIf Accept-Language "en" english
CustomLog logs/english_log common env=english
CustomLog logs/non_english_log common env=!english
尽管我们刚刚展示了条件日志记录非常强大且灵活,但它并不是控制日志内容的唯一方法。当日志文件包含完整的服务器活动记录时,它们会更有用。通常,简单地对日志文件进行后处理以删除您不想考虑的请求会更容易。
答案3
尝试在 iptables 中临时添加一条规则,以删除来自该 IP 地址的任何请求。也许是一些脚本小子在玩弄。但强烈建议使用防火墙来阻止此类请求到达您的 Web 服务器,例如 ufw 或入侵检测系统(如 snort)。