emplacements imbriqués nginx

60

Je ne parviens pas à comprendre les emplacements imbriqués dans nginx. J'ai deux emplacements avec des directives de configuration en commun, alors plutôt que de répéter les directives, je préférerais répéter l'URI en utilisant une expression régulière:

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

Cependant, cela donne l'erreur

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

Sans le ou |cela semble bien, cependant.

location ~ /a {
        location /a {
        }
}

Qu'est-ce que je fais mal? Y a-t-il une meilleure façon de faire cela sans rien répéter? Puis-je regrouper des emplacements d'une autre manière?

Jayen
la source
1
Pourquoi les grouper? Pourquoi ne pas simplement baiser?
Pkhamre
6
parce que logiquement ils sont regroupés
Jayen
Cela m'a pris beaucoup de temps à comprendre, mais au final, j'ai pu créer une simple liste de priorités (ish) indiquant comment les emplacements sont choisis .
artfulrobot

Réponses:

101

Ancienne question, mais le problème vient du fait que l'emplacement parent est un emplacement regex alors que les emplacements imbriqués sont des emplacements de préfixe.

Vous ne pouvez définir des emplacements de préfixes imbriqués que lorsque l'emplacement parent est également un emplacement de préfixe:

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

Lorsqu'un emplacement parent est défini par une expression rationnelle, tous les emplacements imbriqués doivent également être définis par des expressions rationnelles:

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

Cependant, vous pouvez également définir des emplacements imbriqués de regex lorsque l'emplacement parent est un emplacement de préfixe:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}
Dayo
la source
Votre première phrase m'a confondu, mais vos exemples ont du sens. Je suppose que dans le dernier exemple, l'emplacement du préfixe /bgénérera une erreur?
Jayen
13
Cette première phrase devrait être dans la documentation .
AndreKR
1
Dans le premier exemple, si vous laissez de côté le passe- location /a { }partout, l’ordre est-il important?
Meekohi
2
Ah, tant pis, j'ai mal compris. Les emplacements imbriqués n'héritent de rien de leurs emplacements parents.
Meekohi
L'emplacement parent peut être un emplacement non regex, mais plusieurs emplacements imbriqués dans le parent doivent tous être regex / non regex.
MitchellK