Вопрос: вложенные места nginx


У меня возникли проблемы с пониманием вложенных мест в 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 {
        }
}

Что я делаю не так? Есть ли лучший способ сделать это, не повторяя ничего? Могу ли я группировать местоположения по-другому?


44
2018-04-05 07:09


Источник


Зачем их группировать? Почему не просто KISS? - pkhamre
forum.nginx.org/read.php?2,174517,174534#msg-174534 - pkhamre
потому что логически они сгруппированы - Jayen
Это заняло у меня много времени, чтобы понять, но в конце концов я смог создать простой (иш) список приоритетов выбора местоположений, - artfulrobot


Ответы:


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

Вы можете определять только вложенные места префикса, когда родительское местоположение также является префиксом:

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 {
        ...
        }
}

72
2017-09-09 15:00



Я смутился вашим первым предложением, но ваши примеры имеют смысл. В последнем примере я предполагаю, что расположение префикса /b выкинет ошибку? - Jayen
Это первое предложение должно быть в документация, - AndreKR
В первом примере, если вы не учитываете location /a { } шаблонный - имеет значение порядок? - Meekohi
Ах, конечно, я не понял. Вложенные местоположения не наследуют ничего от своих родительских местоположений. - Meekohi
Родительское местоположение может быть местоположением без регулярных выражений, но любые множественные вложенные местоположения в родительском объекте должны быть либо регулярными, либо нереальными. - MitchellK