Я пытался ограничить мой API с помощью Apache, чтобы не загружать мою инфраструктуру и не подключаться к моей БД при каждом вызове, но я изо всех сил стараюсь делать то, что хочу.
Я нашел несколько примеров того, какограничивайте вызовы разными 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
Но я смог бы сгруппировать вызовы по переменной enache Apache, а не по 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
Я посмотрел, но не могу никого найти, используя пользовательскую переменную, установленную ModSec в e SecRule.
Я также пробовал что-то вроде передачи переменной в 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}"
Так что я не знаю, как использовать мой собственный var в моем SecRule.Кто-нибудь знает, как я мог это сделать?
Спасибо.;)