Ограничение скорости в nginx на основе заголовка http

Может быть, я задаю плохой вопрос, но я хочу применить ограничение скорости в nginx на основе пользовательского заголовка http, а не на основе IP. Моя конфигурация на основе IP работает, но я не могу обойти использование пользовательского заголовка http. Я хочу, чтобы, если в http-запросе присутствует определенный заголовок, в противном случае должно применяться ограничение скорости.

файл конфигурации

       http {
            limit_req_zone $http_userAndroidId zone=one:10m rate=1r/s;

       location ^~ /mobileapp{
             set $no_cache 1;
             # set rate limit by pulkit
            limit_req zone=one burst=1;
            limit_req_status 429;
            error_page  429  /50x.html; 
      }
}

Однако ограничение скорости применяется даже при отсутствии заголовка. P.S. userAndroidId — это заголовок моего запроса.


person Pulkit    schedule 15.04.2015    source источник


Ответы (1)


Я думаю, вы можете справиться с этим с картой. Если заголовок присутствует, сопоставьте переменную либо с IP-адресом клиента, либо с пустой строкой и используйте это значение в качестве ключа зоны. Если карта не совпадает, пустая строка предотвратит ограничение скорости.

Что-то вроде этого (не проверено, но должно работать)

map $http_userandroidid $limit {
    default "";
    "~.+" $binary_remote_addr;
}

Это сопоставит пустой отсутствующий заголовок userAndroidId с "", а любое другое значение с $binary_remote_addr. Затем вы можете использовать переменную $limit в своей зоне следующим образом:

limit_req_zone $limit zone=one:10m rate=1r/s;
person Tom Cannaerts    schedule 21.04.2015