我试图用Apache对我的API进行速率限制,以便不必在每次调用时加载我的框架并连接到我的数据库,但我很难做到我想做的事。
我找到了一些关于如何限制不同IP调用的示例,如下所示,并且效果很好:
SecAction id:1,initcol:IP=%{REMOTE_ADDR}
SecAction "id:2,deprecatevar:IP.CALLS_LIMIT=1/10
SecRule IP:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:IP.CALLS_LIMIT=+1
但是,我能做的是通过Apache env变量进行分组调用,而不是通过IP进行分组。 所以我尝试了类似的东西:
SecAction id:1,initcol:ACTOR=%{env.actor}
SecAction "id:2,deprecatevar:ACTOR.CALLS_LIMIT=1/10
SecRule ACTOR:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:ACTOR.CALLS_LIMIT=+1
但是,它并没有像SecRule一样工作,它不会识别演员:
创建规则时出错:未知变量:ACTOR
我看了但是找不到任何人在e SecRule中使用由ModSec设置的自定义var。
我也尝试过将var传递给env,但我的env var似乎仍然是空的......:/
SecAction id:1,initcol:ACTOR=%{env.actor}
SecAction "id:2,deprecatevar:ACTOR.CALLS_LIMIT=1/10,setenv:CALLS_LIMIT=%{ACTOR.CALLS_LIMIT}
SecRule ACTOR:CALLS_LIMIT "@gt 1" "id:3,phase:2,pause:300,deny,status:429,setenv:RATELIMITED,skip:1"
SecAction id:4,setvar:ACTOR.CALLS_LIMIT=+1,setenv:CALLS_LIMIT=%{ACTOR.CALLS_LIMIT}
Header set Test "expr=%{env:CALLS_LIMIT}"
所以我不知道如何在我的SecRule中使用我的自定义变量。 有谁知道我怎么做?
感谢。 ;)