如何消除无用的 Apache mod_rewrite 日志消息?

如何消除无用的 Apache mod_rewrite 日志消息?

我有一些 mod_rewrite 规则来将机器人发出的垃圾请求重定向到静态 404 页面,例如:

RewriteRule ^(.*)\.asp(.*)$ https://%{SERVER_NAME}/errors/404.html [L,R=301,NC]

我有几十条这样的规则。但是,检查我的 Apache 错误日志后,我发现,对于每个请求,都会为每条规则创建一个日志条目,例如:

[Wed May 30 10:52:59.740327 2018] [rewrite:trace3] [pid 2021:tid 140011088312064] mod_rewrite.c(476): [client 10.91.178.131:62065] 10.91.178.131 - - [example.com/sid#7f56e5f7bc18][rid#7f56dc0100a0/initial] applying pattern '^(.*)\\.asp(.*)$' to uri '/admin/', referer: https://example.com/admin/record/149/

为什么 Apache 会将每条规则应用到每个 URL,而它们显然不匹配?这使我的错误日志膨胀,并且几乎不可能找到实际的错误消息。我该如何阻止这种情况,或者至少阻止 Apache 用这些条目向日志文件发送垃圾邮件?

答案1

为什么当它们明显不匹配时,Apache 会将每条规则应用于每个 URL?

它不一定应用规则,而是测试是否应该应用规则,这就是此“调试”日志条目的用途。默认情况下不启用此附加日志级别 - 有人在服务器配置中明确启用了此功能,并且似乎(无意中)将其保留为启用状态。永远不应在生产服务器上永久启用此功能。

在 Apache 2.4+ 上,在服务器配置/虚拟主机中查找LogLevel指令。例如:

LogLevel rewrite:trace3

但请注意,可以设置多个模块的日志级别(或全部模块)使用单个指令。将设置LogLeveldebug, trace1..trace8被视为“调试”级别。级别越高,记录的消息越多。

并将其删除、注释掉或设置为默认值:

LogLevel warn

参考:
https://httpd.apache.org/docs/2.4/mod/core.html#loglevel

相关内容