Dav*_*gen 3 mod-rewrite symbolic-link rewritecond apache-2.2
我想阻止 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]
Run Code Online (Sandbox Code Playgroud)
想法:如果请求的文件不是常规文件,也不是符号链接,则 RewriteRule 将导致不记录错误。这类型的作品。
现在我面临以下问题:如果我实际上创建了一个名为“apple-touch-icon-120x120.png”的符号链接,那么我的 RewriteRule 仍然会触发并且我得到 404。没有规则或当我将文件设为常规文件时文件而不是符号链接,文件被正确提供。我认为通过使用!-l标志,只有当请求的文件不是常规文件并且它也不是符号链接时,我才能触发我的规则。但这似乎不起作用......
我在 Apache 的错误日志中没有看到任何可疑的东西。我在这里可能做错了什么?
如果您在“错误日志”中收到“文件不存在”消息,那么LogLevel(在服务器配置中设置)可以说设置为“太高”。当然,对于生产服务器来说太高了。“文件不存在”是一条info消息,因此您可能LogLevel info在服务器配置中设置了(或以上)。在默认情况下是LogLevel warn。
404(未找到文件)是正常的 HTTP 响应,它不是“服务器错误”。所以,通常,这应该只出现在“访问日志”中,而不是服务器的“错误日志”中。
以下级别可用,按重要性递减的顺序(增加冗长):
Run Code Online (Sandbox Code Playgroud)emerg alert crit error warn (default) notice info "File does not exist" messages debug trace1 trace2 :
参考:
Run Code Online (Sandbox Code Playgroud)RewriteCond %{REQUEST_URI} ^/apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^ - [redirect=404]
是的,如果在目录上下文中使用,如果请求未映射到文件或符号链接,这将防止“错误日志”中出现“文件不存在”消息。但是,这不是解决此 IMO 的正确方法。使用LogLevel如上所述的指令。
如果您在服务器或虚拟主机上下文中使用它,那么它将无条件地提供 404(这可能是您遇到的情况?尽管您说它适用于“常规文件”?)因为请求尚未映射到文件系统在这个阶段,所以REQUEST_FILENAME仍然是 URL 路径(所以条件!-f和!-l总是成功)。在这种情况下,您需要使用前瞻,即。%{LA-U:REQUEST_FILENAME}.
您还需要确保Options +FollowSymLinks已设置。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |