我有一些 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
但请注意,可以设置多个模块的日志级别(或全部模块)使用单个指令。将设置LogLevel
为debug
, trace1
..trace8
被视为“调试”级别。级别越高,记录的消息越多。
并将其删除、注释掉或设置为默认值:
LogLevel warn
参考:
https://httpd.apache.org/docs/2.4/mod/core.html#loglevel