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 的錯誤日誌中沒有看到任何可疑之處。我在這裡可能做錯了什麼?
如果您在“錯誤日誌”中收到“文件不存在”消息,那麼
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]
是的,如果在目錄上下文中使用,如果請求未映射到文件或符號連結,這將防止“錯誤日誌”中出現“文件不存在”消息。但是,這不是解決此 IMO 的正確方法。使用上述
LogLevel
指令。如果您在伺服器或虛擬主機上下文中使用它,那麼它將無條件地提供 404(這可能是您遇到的情況?儘管您說它適用於“正常文件”?),因為請求尚未映射到文件系統在這個階段,所以
REQUEST_FILENAME
仍然是 URL-path(所以條件!-f
和!-l
總是成功的)。在這種情況下,您需要使用前瞻,即。%{LA-U:REQUEST_FILENAME}
.您還需要確保
Options +FollowSymLinks
已設置。