map в nginx
web nginx
Published: 2017-08-16

Кейс следующий:

Есть запросы к API с передачей уникального токена в GET параметре. По этому токену (user_token=) имеются лимиты на запросы через limit_req_zone, типа такого:

limit_req_zone $arg_user_token zone=token5:10m rate=12r/m;

Необходимо для некоторых токенов отключить лимиты. Тут на помощь и приходит модуль map nginx. Он позволяет динамически получать переменную, значение которой будет зависеть от значений других, входных, переменных. Т.е., грубо говоря, мы имеем

function(a, b) { … return c }

Итак, лимит по токену срабатывает, если в запросе имеется значение переменной user_token. Как сделать так, чтобы убрать лимит? Надо чтобы для модуля limit_req_zone переменной не существовало, а точнее $arg_user_token оказалась пустой

map $arg_user_token $token_limit {
    default $arg_user_token; # по-умолчанию на выход отдаём входящее значение
    "11112222abc" ""; # а для этого токена вернём пустую строку
}

И переделываем лимит под новую переменную $token_limit

limit_req_zone $token_limit zone=token5:10m rate=12r/m;
comments powered by Disqus