Apache 2:SetEnvIf“ IP范围”


10

如果我看到访问者来自特定的IP范围,则我想在我的Apache配置中设置一个环境变量。目前,我是这样进行的:

SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip

我更喜欢这样的事情:

SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip

...因为我认为将IP地址转换为字符串然后执行正则表达式完全浪费资源。

我可以做一个

Deny From 194.8.74.0/23

...但是后来我没有一个可以在403错误页面中检查的变量-查找拒绝访问的原因。

有什么建议我可能会错过吗?是否有一个Apache2 MOD可以基于“ IP地址范围”设置环境变量?

Answers:


4

您所拥有的(SetEnvIfNoCase Remote_Addr“ ^ abc” env_key = env_value)是您最容易做到的。我已经看到这种配置样式在负载很重的计算机集群上实现,而没有任何明显的性能下降。我同意使用正则表达式,但更合适的CIDR范围令人讨厌。您可以编写一个小程序,以从CIDR范围列表自动生成配置。

如果您熟悉Perl,则可以创建一个modperl处理程序,该处理程序将以您选择的任何一种方式允许/拒绝请求。modperl允许您的代码在整个HTTP请求中的不同点运行-mod_perl 2.0 HTTP请求周期阶段。PerlAuthzHandler将是适合使用的处理程序。

洛克


8

请注意,通过SetEnv设置的变量在某些操作上不可见(请参见矩阵):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

您的解决方案是

SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918

参见https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr


这应该是公认的答案!这是最好的。它也可以在.htaccess中使用
Jeroen Vermeulen-MageHost


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.