我们有一堆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。我们将全面使用它。
答案 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