如何告诉Apache不在其访问日志中记录某些请求

如何告诉Apache在其访问日志中不记录某些请求

版本1.0
作者:Falko Timme

通常Apache在其访问日志中记录所有请求。 在某些情况下,这可能会扭曲您的页面浏览统计信息(如果您使用WebalizerAWStats等工具来创建基于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的请求

以下是我在这些页面上发现的一些其他示例:

为防止使用特定浏览器(例如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链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏