location и $args

Maxim Dounin mdounin at mdounin.ru
Wed Aug 19 00:44:16 MSD 2009


Hello!

On Tue, Aug 18, 2009 at 09:34:28PM +0400, Alex Hudich wrote:

> Появился вопрос, ответ на который не смог отыскать в документах. 
> 
>  
> 
> Упрощенное описание ситуации: Проксрующий Nginx в связке с Apache. Есть сайт
> с единой точкой входа index.php, конкретная страница выбирается с помощью
> передачи каких-либо аргументов, например index.php?catalogID=номер. Мне
> нужно ограничить количество обращений в единицу времени к странице index.php
> в которую передается данный аргумент. Если аргумент не передается или
> передаются другие любые аргументы количество обращений к данной странице
> ограничивать не нужно.  
> 
>  
> 
> Можно ли такую проверку организовать в отдельном location? Поскольку в
> конструкцию if ($arg ~ catalogID ) { }   limit_req или limit_conn поместить
> нельзя. А когда я делаю location ~* catalogID {}  у меня возникает ощущение,
> что там проверяется только uri без параметров.

Совершенно верно, location проверяет только uri без аргументов.  

> Есть какое-то решение?

Аргументы можно проверить через if внутри location, и уйти оттуда 
в location с нужной конфигурацией через rewrite ... last.

Как-то так:

    location = /index.php {
        if ($arg_catalogid) {
            rewrite ^ /index-limited.php last;
        }
        proxy_pass http://backend;
    }

    location = /index-limited.php {
        limit_req ...
        proxy_pass http://backend/index.php;
    }

Maxim Dounin





More information about the nginx-ru mailing list