通常,Apache会在其访问日志中记录所有请求。在某些情况下,这可能会扭曲你的页面浏览统计数据(如果你使用Webalizer或AWStats等工具,根据Apache的访问日志创建统计数据),例如,如果你从搜索引擎蜘蛛或某个IP地址(例如你自己的)获得了大量访问,或者如果你的每个页面都包含你网站上的另一个页面(例如在iframe中)(这会立即使你的页面访问量翻倍,这显然是不正确的)。本简短指南展示了如何使用Apache的SetEnvIf指令来防止Apache记录此类请求。
1使用SetEnvIf
SetEnvIf指令可以在Apache配置中的以下上下文中使用:在全局Apache配置中(如果该指令对整个服务器有效),在vhost配置中(若该指令仅对特定vhost有效),以及在(如果该指令仅对特定目录及其子目录有效),以及.htaccess文件(必须设置AllowOverride FileInfo)。
使用SetEnvIf,您可以根据以下条件阻止请求被记录(其中包括-请参阅https://httpd.apache.org/docs/current/mod/mod_setenvif.html更多详情):
host
User-Agent
Referer
Accept-Language
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
其中属性是我刚才提到的标准之一,正则表达式是一个Perl兼容的正则表达式。
现在,让我们假设Monit每分钟请求一次/Monit/token文件,以检查Apache是否仍在运行。显然,我们不想记录这些请求,因为它们不是来自真实用户。因此,我们使用以下SetEnvIf指令:
SetEnvIf Request_URI "^/monit/token$" dontlog
^意味着Request_URI必须以/monit/token开头,$意味着它也必须以/monit/token结尾(因此只有/monit/teoken与此正则表达式匹配)。如果我们使用“^/monit/token”,则任何以/monit/toke开头的URL都将与正则表达式匹配,例如/monit/teoken/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 to the line:
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
暂无评论内容