zagnieżdżone lokalizacje nginx

60

Mam problem ze zrozumieniem zagnieżdżonych lokalizacji w Nginx. Mam dwie lokalizacje ze wspólnymi dyrektywami konfiguracyjnymi, więc zamiast powtarzać dyrektywy, wolę powtarzać URI przy użyciu wyrażenia regularnego:

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

Daje to jednak błąd

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

Bez lub |wydaje się to w porządku.

location ~ /a {
        location /a {
        }
}

Co ja robię źle? Czy istnieje lepszy sposób na zrobienie tego bez powtarzania czegokolwiek? Czy mogę grupować lokalizacje w inny sposób?

Jayen
źródło
1
Po co je grupować? Dlaczego nie tylko KISS?
pkhamre
6
ponieważ logicznie są zgrupowane
Jayen
Długo to zajęło mi zrozumienie, ale ostatecznie udało mi się stworzyć prostą (ish) priorytetową listę wyboru lokalizacji .
artfulrobot

Odpowiedzi:

101

Stare pytanie, ale problemem jest to, że lokalizacja nadrzędna jest lokalizacją wyrażenia regularnego, podczas gdy lokalizacje zagnieżdżone są lokalizacjami prefiksów.

Można zdefiniować zagnieżdżone lokalizacje prefiksów tylko wtedy, gdy lokalizacja nadrzędna jest także lokalizacją prefiksu:

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

Gdy lokalizacja nadrzędna jest zdefiniowana za pomocą wyrażenia regularnego, wszelkie zagnieżdżone lokalizacje muszą być również zdefiniowane za pomocą wyrażeń regularnych:

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

Można jednak również zdefiniować zagnieżdżone lokalizacje wyrażenia regularnego, gdy lokalizacja nadrzędna jest lokalizacją prefiksu:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}
Dayo
źródło
Pierwsze zdanie zdezorientowało mnie, ale twoje przykłady mają sens. Zakładam, że w ostatnim przykładzie lokalizacja prefiksu /bzgłosi błąd?
Jayen
13
To pierwsze zdanie powinno znajdować się w dokumentacji .
AndreKR
1
W pierwszym przykładzie, jeśli location /a { }pominiesz płytę grzewczą - czy kolejność ma znaczenie?
Meekohi
2
Ach, nieważne, źle zrozumiałem. Lokalizacje zagnieżdżone nie dziedziczą niczego po lokalizacjach nadrzędnych.
Meekohi
Lokalizacja nadrzędna może być lokalizacją nieregexową, ale wszystkie wielokrotne zagnieżdżone lokalizacje w obiekcie nadrzędnym muszą być albo regex / non regex.
MitchellK,