Почему использование content_by_lua_block позволяет директивам местоположения nginx проходить? - PullRequest
0 голосов
/ 18 октября 2019

Я использую openresty/1.15.8.2 в качестве прокси-сервера перед приложением, которое иногда должно принимать файлы большого размера.

Я хотел установить client_max_body_size 200M условно, поэтому только тот URL-адрес, который ожидает файлы, принимает большой размер тела. Первым делом я попытался установить проверку URL в операторе if, например:

if ($url ~ /path/to/file/upload) {
    content_max_body_size 200M;
}

Это не работает, так как nginx говорит, что директива content_max_body_size здесь не разрешена.

Следующая вещьЯ пробовал использовать вложенный блок местоположения, например, так:

location ~ ^(mypatterns)$ {
    # do stuff

    location ~ ^/path/for/file/upload$ {
        client_max_body_size 200M;
    }

    # do stuff
    proxy_pass whatever;
}

Хотя это не работает. Я получаю сообщение об ошибке, подобное:

*14941 open() "/.../path/for/file/upload" failed (2: No such file or directory), ...

Это означает, что вложенное расположение пытается найти файл для обслуживания, а не проходит через остальную часть внешнего блока местоположения.

Однако, еслиЯ установил пустую директиву content_by_lua_block {} во вложенном месте, она отлично работает:

location ~ ^(mypatterns)$ {
    # do stuff

    location ~ ^/path/for/file/upload$ {
        client_max_body_size 200M;
        content_by_lua_block {}
    }

    # do stuff
    proxy_pass whatever;
}

Теперь

  1. только для /path/for/file/uploads допускается большой размер тела
  2. запросы, соответствующие этому пути, также «проходят» до остального материала и proxy_pass

Он делает то, что я хочу, но почему ? Что особенного в вызове директивы content_by_lua_block, через которую она проходит? Как я могу заставить его пройти через vanilla nginx, без content_by_lua_block?

Обратите внимание, что если я разделю это на две отдельные не вложенные директивы местоположения, он все равно будет работать нормально.

...