posizioni nidificate nginx


60

Ho difficoltà a comprendere le posizioni nidificate in nginx. Ho due posizioni con alcune direttive di configurazione in comune, quindi piuttosto che ripetere le direttive, preferirei ripetere l'URI usando un'espressione regolare:

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

Tuttavia, questo dà l'errore

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

Senza o |sembra a posto, però.

location ~ /a {
        location /a {
        }
}

Che cosa sto facendo di sbagliato? C'è un modo migliore per farlo senza ripetere nulla? Posso raggruppare le posizioni in un altro modo?


1
Perché raggrupparli? Perché non solo KISS?
pkhamre,


6
perché logicamente sono raggruppati
Jayen il

Mi ci è voluto molto tempo per capire, ma alla fine sono stato in grado di creare un semplice elenco di priorità (ish) di come vengono scelte le posizioni .
artfulrobot

Risposte:


101

Vecchia domanda, ma il problema è perché la posizione principale è una posizione regex mentre le posizioni nidificate sono posizioni prefisso.

È possibile definire posizioni prefisso nidificate solo quando la posizione padre è anche una posizione prefisso:

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

Quando una posizione padre è definita da una regex, anche tutte le posizioni nidificate devono essere definite da regex:

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

Tuttavia, è anche possibile definire posizioni regex nidificate quando la posizione padre è una posizione prefisso:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

Sono stato confuso dalla tua prima frase, ma i tuoi esempi hanno senso. Presumo nell'ultimo esempio, la posizione del prefisso /bgenererà un errore?
Jayen,

13
Quella prima frase dovrebbe essere nella documentazione .
AndreKR,

1
Nel primo esempio, se si esclude la location /a { }piastra della caldaia, l'ordine conta?
Meekohi,

2
Ah, non ho mai capito male. Le posizioni nidificate non ereditano nulla dalle posizioni principali.
Meekohi,

La posizione padre può essere una posizione non regex ma tutte le posizioni multiple nidificate all'interno del padre devono essere tutte regex / non regex.
MitchellK,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.