locais aninhados nginx

60

Estou tendo problemas para entender locais aninhados no nginx. Eu tenho dois locais com algumas diretivas de configuração em comum; portanto, em vez de repetir as diretivas, prefiro repetir o URI usando uma expressão regular:

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

No entanto, isso dá o erro

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

Sem o ou |parece bom, no entanto.

location ~ /a {
        location /a {
        }
}

O que estou fazendo errado? Existe uma maneira melhor de fazer isso sem repetir nada? Posso agrupar locais de outra maneira?

Jayen
fonte
11
Por que agrupá-los? Por que não apenas o KISS?
Pkhamre
6
porque logicamente eles são agrupados
Jayen
Demorei muito tempo para entender, mas no final consegui criar uma lista simples ( prioritária ) de como os locais são escolhidos .
Artfulrobot

Respostas:

101

Pergunta antiga, mas o problema é porque o local pai é um local de regex enquanto os locais aninhados são locais de prefixo.

Você só pode definir locais de prefixo aninhados quando o local pai também for um local de prefixo:

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

Quando um local pai é definido por uma regex, todos os locais aninhados também devem ser definidos por regexes:

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

No entanto, você também pode definir locais de regex aninhados quando o local pai for um local de prefixo:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}
Dayo
fonte
Fiquei confuso com sua primeira frase, mas seus exemplos fazem sentido. Presumo que no último exemplo, o local do prefixo /bgerará um erro?
Jayen
13
Essa primeira frase deve constar na documentação .
precisa saber é o seguinte
11
No primeiro exemplo, se você deixar de fora o location /a { }padrão - o pedido é importante?
Meekohi
2
Ah, deixa pra lá, eu entendi errado. Os locais aninhados não herdam nada dos locais principais.
Meekohi
O local pai pode ser um local não regex, mas todos os vários locais aninhados no pai devem ser todos regex / non regex.
MitchellK