verschachtelte Orte nginx

60

Ich habe Probleme beim Verstehen von verschachtelten Positionen in Nginx. Ich habe zwei Speicherorte mit einigen Konfigurationsanweisungen gemeinsam. Anstatt die Anweisungen zu wiederholen, würde ich es vorziehen, die URI mit einem regulären Ausdruck zu wiederholen:

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

Dies gibt jedoch den Fehler

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

Ohne das oder |scheint es aber in Ordnung zu sein.

location ~ /a {
        location /a {
        }
}

Was mache ich falsch? Gibt es einen besseren Weg, dies zu tun, ohne etwas zu wiederholen? Kann ich Standorte auf andere Weise gruppieren?

Jayen
quelle
1
Warum sie gruppieren? Warum nicht einfach KISS?
Pkhamre
6
weil sie logischerweise gruppiert sind
Jayen
Ich habe lange gebraucht, um zu verstehen, aber am Ende konnte ich eine einfache (ish) Prioritätsliste erstellen, wie Standorte ausgewählt werden .
Artfulrobot

Antworten:

101

Alte Frage, aber das Problem ist, dass der übergeordnete Speicherort ein regulärer Speicherort ist, während die verschachtelten Speicherorte Präfixspeicherorte sind.

Sie können verschachtelte Präfixspeicherorte nur definieren, wenn der übergeordnete Speicherort auch ein Präfixspeicherort ist:

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

Wenn ein übergeordneter Speicherort durch einen regulären Ausdruck definiert wird, müssen alle verschachtelten Speicherorte auch durch reguläre Ausdrücke definiert werden:

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

Sie können jedoch auch verschachtelte Regex-Speicherorte definieren, wenn der übergeordnete Speicherort ein Präfix-Speicherort ist:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}
Dayo
quelle
Ihr erster Satz hat mich verwirrt, aber Ihre Beispiele sind sinnvoll. Ich gehe davon aus, dass im letzten Beispiel der Präfix-Speicherort /beinen Fehler auslöst.
Jayen
13
Dieser erste Satz sollte in der Dokumentation enthalten sein .
AndreKR
1
Wenn Sie im ersten Beispiel das location /a { }Kesselschild weglassen - spielt die Bestellung eine Rolle?
Meekohi
2
Ah vergiss, dass ich falsch verstanden habe. Die verschachtelten Speicherorte erben nichts von ihren übergeordneten Speicherorten.
Meekohi
Der übergeordnete Speicherort kann ein nicht regulärer Speicherort sein, aber mehrere verschachtelte Speicherorte im übergeordneten Speicherort müssen entweder regulär oder nicht regulär sein.
MitchellK