我想防止 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 的错误日志中没有看到任何可疑之处。我在这里可能做错了什么?
如果您在“错误日志”中收到“文件不存在”消息,那么
LogLevel
(在服务器配置中设置)可以说设置为“太高”。当然,对于生产服务器来说太高了。“文件不存在”是一条info
消息,因此您可能LogLevel info
在服务器配置中设置了(或以上)。默认值为LogLevel warn
. _404(找不到文件)是正常的 HTTP 响应,它不是“服务器错误”。所以,通常情况下,这应该只出现在“访问日志”中,而不是服务器的“错误日志”中。
参考:
是的,如果在目录上下文中使用,如果请求未映射到文件或符号链接,这将防止“错误日志”中出现“文件不存在”消息。但是,这不是解决此 IMO 的正确方法。使用上述
LogLevel
指令。如果您在服务器或虚拟主机上下文中使用它,那么它将无条件地提供 404(这可能是您遇到的情况?虽然您说它适用于“常规文件”?),因为请求尚未映射到文件系统在这个阶段,所以
REQUEST_FILENAME
仍然是 URL-path(所以条件!-f
和!-l
总是成功的)。在这种情况下,您需要使用前瞻,即。%{LA-U:REQUEST_FILENAME}
.您还需要确保
Options +FollowSymLinks
已设置。