Apache:不要记录某些不存在的文件(常规文件或符号链接)的错误

Apache:不要记录某些不存在的文件(常规文件或符号链接)的错误

我想阻止 Apache 记录“文件不存在“错误是针对某些经常被请求的不相关的、不存在的文件,例如“apple-touch-icon-120x120.png”。这些日志条目使我的日志变得混乱,很难看到“真正的”问题。这就是我想到的:

RewriteCond %{REQUEST_URI} ^/apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ - [redirect=404]

思路:如果请求的文件不是常规文件,也不是符号链接,则 RewriteRule 将导致错误不被记录。有点儿作品。

现在我面临以下问题:如果我实际创建了一个名为“apple-touch-icon-120x120.png”的符号链接,那么我的 RewriteRule 仍然会触发,并且我会得到 404。如果没有规则,或者当我将文件设为常规文件而不是符号链接时,文件可以正确提供。我认为通过使用!-l仅当请求的文件不是常规文件时,我才能触发规则它也不是符号链接。但这似乎不起作用……

我在 Apache 的错误日志中没有看到任何可疑的内容。我可能做错了什么?

答案1

如果您在“错误日志”中收到“文件不存在”消息,则LogLevel(如服务器配置中设置)可能设置得“太高”。当然,太高对于生产服务器。“文件不存在”是一条info消息,因此您可能已LogLevel info在服务器配置中设置(或以上)。默认LogLevel warn

404(文件未找到)是正常的 HTTP 响应,它不是“服务器错误”。因此,通常情况下,它只会出现在“访问日志”中,而不是服务器的“错误日志”中。

有以下级别可供选择,按重要性降低(详细程度增加)的顺序排列:

emerg
alert
crit
error
warn    (default)
notice
info    "File does not exist" messages
debug
trace1
trace2
:

参考:


RewriteCond %{REQUEST_URI} ^/apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ - [redirect=404]

是的,如果用于目录上下文,如果请求未映射到文件或符号链接,这将阻止“错误日志”中出现“文件不存在”消息。但是,在我看来,这不是解决此问题的正确方法。请使用LogLevel上面描述的指令。

如果你在服务器或者虚拟主机上下文,那么它将无条件地提供 404(这可能是您遇到的情况?虽然您说它适用于“常规文件”?)因为请求在此阶段尚未映射到文件系统,因此REQUEST_FILENAMEURL 路径仍然是(因此条件!-f!-l总是成功的)。在这种情况下,您需要使用前瞻,即%{LA-U:REQUEST_FILENAME}

您还需要确保已Options +FollowSymLinks设置。

相关内容