我想阻止 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_FILENAME
URL 路径仍然是(因此条件!-f
和!-l
总是成功的)。在这种情况下,您需要使用前瞻,即%{LA-U:REQUEST_FILENAME}
。
您还需要确保已Options +FollowSymLinks
设置。