I want to prevent Apache from logging "File does not exist" errors for certain irrelevant non-existing files that are often requested, such as "apple-touch-icon-120x120.png". These log entries clutter my log and make it difficult to see "real" problems. This is what I came up with:
RewriteCond %{REQUEST_URI} ^/apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ - [redirect=404]
The idea: If the file requested isn't a regular file and it isn't a symbolic link either, the RewriteRule will cause the error not to be logged. That kind of works.
Now I'm facing the following problem: If I actually create a symbolic link named "apple-touch-icon-120x120.png", then my RewriteRule still fires and I get 404. Without the rule or when I make the file a regular file and not a symbolic link, the file is served correctly. I thought that by using the !-l flag I could make my rule fire only if the requested file is not a regular file and it is not a symbolic link either. But that doesn't seem to work ...
I don't see anything suspicious in Apache's error log. What might I be doing wrong here?
If you are getting "File does not exist" messages in your "error log" then the
LogLevel
(as set in the server config) is arguably set "too high". Certainly, too high for a production server. "File does not exist" is aninfo
message, so you may haveLogLevel info
(or above) set in the server config. The default isLogLevel warn
.A 404 (file not found) is a normal HTTP response, it's not a "server error". So, ordinarily, this should only appear in the "access log", not the server's "error log".
Reference:
Yes, if used in a directory context, this prevents the "File does not exist" message in the "error log" if the request does not map to a file or symbolic link. However, this is not the correct way to resolve this IMO. Use the
LogLevel
directive as described above.If you are using this in a server or virtualhost context then it will unconditionally serve a 404 (which may be what you are experiencing? Although you say it works for "regular files"?) since the request has not yet been mapped to the file system at this stage, so
REQUEST_FILENAME
is still the URL-path (so the conditions!-f
and!-l
are always successful). In this context you need to use a lookahead instead, ie.%{LA-U:REQUEST_FILENAME}
.You also need to ensure that
Options +FollowSymLinks
is set.