使用apache + mod_rewrite重写基于accesslog - 可能吗?

时间:2011-07-02 11:34:21

标签: apache mod-rewrite logging

我们有一堆mod_rewrite规则。

这些是简单的URI + GeoIP Continent = R = 302,L规则。

他们工作得很好。我们已经使用各大洲的盒子进行了测试,一切都按预期工作。

我们希望添加一个最终规则,该规则只为未满足任何“上述”规则的请求启用访问日志,但允许请求按要求完成。这样我们就可以更清楚地了解通过所有未重定向的规则。

可以使用apache2 + mod_rewrite?


我们如何完成这一点,正如下面的regilero州的回答(信誉是他的全部):

1)

在重写规则结束时,我们添加了一条规则,它对于我们想要记录的特定文件来说是一种捕获。我们使用E = envname:值作为regilero声明。

RewriteRule ^filename.ext$ filename.ext [L,E=logme:true]

2)

然后我们添加了以下自定义日志条目

CustomLog /var/log/httpd/your_custom_log.log "%v:%p | %r | %{User-agent}i" env=logme

如你所见,env = logme。基本上意味着如果设置了变量logme,那就是shizle的自定义日志。

上面的customlog相当少,我们只想知道服务器:port |请求网址|用户代理。您可以使用http://httpd.apache.org/docs/2.0/mod/mod_log_config.html中的“自定义日志格式”,根据需要进行更改。

3)

使用上面的内容,我们可以找出通过我们稍微复杂(useragent + geoip continent)重写规则的内容(如果有的话)并相应地对这些信息采取行动。

最后一点:尽管我们没有进行任何真正的实证测试,但我确定这些“抓住所有”的重写规则相当重要。理想情况下,您只需要将其作为决策制定工具,并在决定正确的行动方案后将其关闭。虽然我确定一切都取决于您的网络资产的繁忙程度;)


这非常有用。使用此方法,您可以记录各种活动。再次,一颗心感谢regilero。我们将全面使用它。

1 个答案:

答案 0 :(得分:3)

您可以使用mod_rewrite在最后一个catch-all规则(对于那些与任何geoIp规则不匹配的规则)上使用标记[E=myspecialenvname:1]设置环境变量,您可以在其他匹配的情况下取消设置此变量如果是其他规则[E=!myspecialenvname]的特定多循环过程。

然后你必须根据那个env事件进行记录。如果您选中customLog directive,则会看到语法为:

CustomLog file|pipe format|nickname [env=[!]environment-variable]
  

第三个参数是可选的,它根据服务器环境中是否存在特定变量来控制是否记录特定请求。如果为请求设置了指定的环境变量(或者未设置,则在'env =!name'子句的情况下),则将记录该请求。

所以你必须写下这样的东西:

CustomLog path/to/unmatched-geoip.log "%h %l %a %A %t \"%r\" %>s %b" env=myspecialenvname