Route by request method

Maxim Dounin mdounin на mdounin.ru
Вт Фев 9 14:12:22 UTC 2021


Hello!

On Tue, Feb 09, 2021 at 04:40:02PM +0300, Eugene Prokopiev wrote:

> Но я вот задумался: а нельзя ли прямо внутри if использовать
> pass_proxy? Тут -
> https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
> указан
> сontext: if in location - значит можно? Я попробовал - не работает. Почему?

Теоретически - можно.  На практике - это чревато проблемами.  
Подробный ответ на вопрос "почему" есть в статье "if is evil", она 
ещё сохранилась в остатках wiki:

https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

Скажем, вот такая конфигурация работает без проблем:

    location / {
        if ($request_method != GET) {
            proxy_pass http://127.0.0.1:8081;
        }

        # static
    }

Но уже вот такая сделает совсем не то, что хотелось бы:

    location / {
        if ($request_method != GET) {
            proxy_pass http://127.0.0.1:8081;
        }

        set $true 1;
        if ($true) {
            # nothing
        }

        # static
    }

Конкретно для исходной задачи наиболее простым и органичным 
решением будет, IMHO, использование limit_except, как-то так:

    location / {
        limit_except GET {
            proxy_pass http://127.0.0.1:8081;
        }

        # static
    }

Но и тут есть свои нюансы: скажем, если в location'е есть 
директивы модуля rewrite, в часности - те же if'ы, то они просто 
не будут работать для запросов, попавших в блок limit_except.

Ну а наиболее универсальное решение из всех возможных уже привёл 
Олег - сделать rewrite по нужному условию в другой location и там 
уже делать что угодно.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru