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?


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.