вложенные местоположения 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 {
        }
}

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

Jayen
источник
1
Зачем их группировать? Почему не просто поцелуй?
Пхамре
6
потому что по логике они сгруппированы
Jayen
Мне потребовалось много времени, чтобы понять, но в итоге я смог создать простой (ish) список приоритетов того, как выбираются места .
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 {
        ...
        }
}
Dayo
источник
Меня смутило ваше первое предложение, но ваши примеры имеют смысл. Я предполагаю, что в последнем примере местоположение префикса /bбудет выдавать ошибку?
Jayen
13
Это первое предложение должно быть в документации .
AndreKR
1
В первом примере, если вы location /a { }опустите шаблон - имеет ли значение порядок?
Meekohi
2
Ах, я не так понял. Вложенные местоположения ничего не наследуют от своих родительских местоположений.
Meekohi
Родительское местоположение может быть местоположением без регулярных выражений, но любые несколько вложенных расположений в родительском местоположении должны быть либо регулярными, либо регулярными.
MitchellK