вкладені локації nginx


60

У мене виникають проблеми з розумінням вкладених місць у nginx. У мене є два місця з деякими директивами конфігурації, тому замість повторення директив я вважаю за краще повторити URI, використовуючи регулярний вираз:

location ~ /a|/b {
        location /a {
        }
        location /b {
        }
}

Однак це дає помилку

nginx: [emerg] location "/a" is outside location "/a|/b" in /etc/nginx/nginx.conf:36

Без або, |здається, добре, хоча.

location ~ /a {
        location /a {
        }
}

Що я роблю неправильно? Чи є кращий спосіб зробити це, не повторюючи нічого? Чи можна групувати місця іншим способом?


1
Навіщо їх групувати? Чому б не просто KISS?
pkhamre


6
тому що логічно вони згруповані
Jayen

Це знадобило мені багато часу, щоб зрозуміти, але врешті-решт я зміг створити простий ( пріоритетний ) список пріоритетів того, як обираються місця .
artfulrobot

Відповіді:


101

Старе питання, але проблема полягає в тому, що батьківське місце розташування - це регулярне вираження, а вкладені - це префіксні місця.

Ви можете визначити вкладені префіксні місця лише тоді, коли батьківське місце розташування також є місцем префікса:

location /a {
        location /a {
               # You can also skip this location and just write
               # your code directly under the parent location
        }
        location /a/b {
        ...
        }
}

Коли батьківське місце розташування визначається за допомогою регулярного вираження, будь-які вкладені місця також повинні бути визначені регулярними виразами:

location ~ ^/(a|b) {
        location ~ ^/a {
        ...
        }
        location ~ ^/b {
        ...
        }
}

Однак ви також можете визначити вкладені географічні місця, коли батьківське місце розташування є префіксом:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

Я заплутався у вашому першому реченні, але ваші приклади мають сенс. Я припускаю, що в останньому прикладі місце префікса /bпризведе до помилки?
Jayen

13
Це перше речення має бути в документації .
AndreKR

1
У першому прикладі, якщо ви залишите location /a { }котельну плиту - чи має значення замовлення?
Meekohi

2
Ну ніколи не розумію, що я не зрозумів. Вкладені місця нічого не успадковують від батьківських місць.
Meekohi

Батьківське місцеположення може бути негенеральним місцем розташування, але будь-яке декілька вкладених місць у батьківській структурі повинно бути або регулярним / не-регулярним.
MitchellK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.