如何告诉Apache在其访问日志中不记录某些请求
版本1.0
作者:Falko Timme
通常Apache在其访问日志中记录所有请求。 在某些情况下,这可能会扭曲您的页面浏览统计信息(如果您使用Webalizer或AWStats等工具来创建基于Apache访问日志的统计信息),例如,如果您从搜索引擎蜘蛛或某个IP地址(例如,您自己的),或者如果您的每个页面都包含来自您的网站的另一个页面(例如,在iframe中)(这将立即使您的页面视图翻倍显然不正确)。 本简短的指南显示了如何使用Apache的SetEnvIf指令来阻止Apache记录这些请求。
本文档不附带任何形式的保证! 我不会保证这将为您工作!
1使用SetEnvIf
SetEnvIf
指令可以在Apache配置中的以下上下文中使用:在全局Apache配置中(如果该指令对整个服务器应该有效),在vhost配置中(如果该指令仅对该特定虚拟机有效)在<Directory ...> </ Directory>
(如果指令仅对某个目录及其子目录有效),并且.htaccess
文件( AllowOverride FileInfo
必须设置)。
使用SetEnvIf
,您可以根据以下条件阻止请求记录(其中包括 - 请参阅http://httpd.apache.org/docs/2.0/mod/mod_setenvif.html了解更多详细信息):
- 主办
- 用户代理
- 参赞
- 接受语言
-
Remote_Host
:发出请求的客户端的主机名(如果可用)。 -
Remote_Addr
:发出请求的客户端的IP地址。 -
Server_Addr
:接收请求的服务器的IP地址(只有2.0.43以后的版本)。 -
Request_Method
:正在使用的方法的名称(GET,POST等)。 -
Request_Protocol
:请求的协议的名称和版本(例如“HTTP / 0.9”,“HTTP / 1.1”等)。 -
Request_URI
:HTTP请求行上请求的资源 - 通常是方案中的URL部分,而没有查询字符串的主机部分。
SetEnvIf
指令具有以下形式:
SetEnvIf attribute regex env-variable
where 属性
是我刚刚提到的标准之一, 正则表达式
是一个Perl兼容的正则表达式 。
现在我们假设Monit正在一分钟请求文件/ monit / token
,以检查Apache是否仍在运行。 显然,我们不想记录这些请求,因为它们不是来自真正的用户。 因此,我们使用以下SetEnvIf
指令:
SetEnvIf Request_URI "^/monit/token$" dontlog
^
表示Request_URI必须以/ monit / token
开头, $
表示它也必须以/ monit / token
结尾(因此只有/ monit / token
匹配此正则表达式)。 如果我们使用“^ / monit / token”
,则以/ monit / token
开头的任何URL将与正则表达式匹配,例如/monit/token/example.html
; “/ monit / token $”
将匹配以/ monit / token
结尾的任何URL,例如/ example / monit / token
。
现在我们在/iframe/iframe.html
中有一个iframe,我们也不想登录。 这是我们会用的:
SetEnvIf Request_URI "^/iframe/iframe.html$" dontlog
现在我们必须告诉Apache它不能记录标记有dontlog的
所有请求。 在Apache配置中查找CustomLog
指令,例如
CustomLog /var/log/apache2/access.log combined
要么
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined
并添加env =!dontlog
到行:
CustomLog /var/log/apache2/access.log combined env=!dontlog
要么
CustomLog "|/usr/bin/cronolog --symlink=/var/log/httpd/access.log /var/log/httpd/access.log_%Y_%m_%d" combined env=!dontlog
之后重新启动Apache。 现在它不会记录任何标记为dontlog的请求
。
以下是我在这些页面上发现的一些其他示例:
- http://forums.digitalpoint.com/showthread.php?p=488716
- http://www.keithjbrown.co.uk/vworks/unix/logs.php
- http://www.htaccesselite.com/htaccess/setenvif-examples-vt141.html
为防止使用特定浏览器(例如Internet Explorer)进行的所有请求都被记录下来,您可以使用:
SetEnvIf User_Agent "(MSIE)" dontlog
要不
从主机名以bla.example.com
结尾的任何客户端记录请求,请使用:
SetEnvIf Remote_Host "bla.example.com$" dontlog
要以不以主机名开头的任何客户端记录请求,请使用:
SetEnvIf Remote_Host "^example" dontlog
要不从某个IP地址记录请求,请使用以下命令:
SetEnvIf Remote_Addr "192\.168\.0\.154" dontlog
如果您不希望robots.txt的
请求被记录下来,请使用:
SetEnvIf Request_URI "^/robots\.txt$" dontlog
除了SetEnvIf
,区分大小写,您可以使用不区分大小写的SetEnvIfNoCase。
例如,为了不记录特定的搜索引擎蜘蛛,您可以使用:
SetEnvIFNoCase User-Agent "Slurp/cat" dontlog
SetEnvIFNoCase User-Agent "Ask Jeeves/Teoma" dontlog
SetEnvIFNoCase User-Agent "Googlebot" dontlog
SetEnvIFNoCase Remote_Host "fastsearch.net$" dontlog
或者不记录某些文件扩展名,请使用以下内容:
SetEnvIfNoCase Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$" dontlog
要不记录某些引用(例如从您自己的域),请使用以下内容:
SetEnvIfNoCase Referer "www\.mydomain\.com" dontlog
2链接
- Apache模块mod_setenvif: http : //httpd.apache.org/docs/2.0/mod/mod_setenvif.html