Re: location / внутри location /
Maxim Dounin
mdounin на mdounin.ru
Ср Янв 27 17:35:41 UTC 2021
Hello!
On Wed, Jan 27, 2021 at 07:14:27PM +0300, Slawa Olhovchenkov wrote:
> On Wed, Jan 27, 2021 at 07:07:35PM +0300, Maxim Dounin wrote:
>
> > Hello!
> >
> > On Wed, Jan 27, 2021 at 06:43:10PM +0300, Slawa Olhovchenkov wrote:
> >
> > > On Wed, Jan 27, 2021 at 06:34:15PM +0300, Maxim Dounin wrote:
> > >
> > > > Hello!
> > > >
> > > > On Wed, Jan 27, 2021 at 05:08:45PM +0300, Slawa Olhovchenkov wrote:
> > > >
> > > > > А возможна ли конструкция типа такой:
> > > > >
> > > > > location / {
> > > > > rewrite ....;
> > > > > rewrite ....;
> > > > > location ~ /../(..)... {
> > > > > try_files /$2/$3/$2$3$4_$1.bin @proxy;
> > > > > }
> > > > > location / {
> > > > > try_files /notexist @proxy;
> > > > > }
> > > > > }
> > > > > location @proxy {
> > > > > }
> > > > >
> > > > > Ну т.е. смысл в том, что не попадает под маску -- сразу брать с
> > > > > апстрима, а что под маску попадает -- проверять на диске и если нет --
> > > > > брать с апстрима.
> > > >
> > > > Возможна. Впрочем, в предложенной конструкции вложенный "location /"
> > > > избыточен, его содержимое можно написать непосредственно во
> > > > внешнем "location /".
> > >
> > > а кстати, есть ли какой-то более изящный способ сделать внутрений
> > > редирект на @proxy в данном случае?
> >
> > Можно сделать
> >
> > error_page 418 @proxy;
> > return 418;
> >
> > "Более изящный" ли это способ - затрудняюсь сказать, но более
> > смешной.
> >
> > Более правильным в данном случае будет просто прописать
> > проксирование явно.
>
> в смысле два раза копировать конфигурацию прокси?
> она сильно развесистая, не хотелось бы дублирования.
Конфигурацию прокси можно задать на уровне http или server, а в
соответствующих location'ах писать исключительно proxy_pass. Если
конфигурацию зачем-то требуется задавать непосредственно в
location - то это можно сделать с помощью директивы include.
> > > > Заодно и написанные во внешнем "location /" директивы rewrite
> > > > обретут какой-то смысл (впрочем, скорее всего по прежнему
> > > > неверный, так как эти директивы не применяются к запросам,
> > > > попавшим в любой из вложенных location'ов).
> > >
> > > разве rewrite применяется не до разбора вложенных локейшинов?
> >
> > Нет. Дерево location'ов - общее, поиск подходящего location'а по
> > URI - это единая операция. Директивы rewrite применяются из
> > найденного подходящего к запросу location'а. Подробности
> > применения директив rewrite расписаны в описании модуля rewrite,
> > тут:
> >
> > http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html
>
> читал, но понял видимо неправильно, в том куске который "Если
> директива указана внутри location, дальнейшая обработка запроса
> продолжается в этом location.". я это понял так, что при наличии там
> вложенных локейшинов подбор будет продолжен с них.
Это часть описания директивы break, и она верна в том смысле, что
если директива break будет выполнена - то дальнейшкая обработка
продолжится в том location, в котором указана директива break, то
есть даже если URI запроса изменился, nginx не будет снова искать
location, соответствующий новому URI запроса.
Читать в первую очередь следует основную схему работы, которая
расписана непосредственно в описании модуля:
: Директивы break, if, return, rewrite и set обрабатываются в
: следующем порядке:
:
: - последовательно выполняются директивы этого модуля, описанные на
: уровне server;
: - в цикле:
: - ищется location по URI запроса;
: - последовательно выполняются директивы этого модуля, описанные в
: найденном location;
: - цикл повторяется, если URI запроса изменялся, но не более 10 раз.
Соответственно директива break позволяет изменить URI и выйти из
цикла несмотря на это, но никак не влияет на то, что поиск
location по URI запроса - единая операция.
> а почему, кстати, может игнориоваться директива set?
> я по дебаг логу смотрю, попадаю во вложенный локейшен, там у меня есть
> set но он даже выполняться не собирался.
Простейшая причина - обработка директив модуля rewrite остановлена
с помощью директивы break или "rewrite ... break".
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru