OP bevorzugte ein Beispiel. Auch was @minaev schrieb, war nur ein Teil der Geschichte! Auf geht's...
Beispiel 1: Keine (break oder last) Flags
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1;
rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}
Ergebnis:
# curl example.com/test.txt
finally matched location /documents
Erläuterung:
Denn rewrite
die Flags sind optional!
Beispiel 2: Außerhalb des Standortblocks (Pause oder Letzte)
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
Ergebnis:
# curl example.com/test.txt
finally matched location /notes
Erläuterung:
Außerhalb des Standortblocks verhalten sich beide break
und last
genau so ...
- Kein Parsen von Umschreibebedingungen mehr
- Nginx Internal Engine geht zur nächsten Phase (Suche nach
location
Übereinstimmung)
Beispiel 3: Innerhalb des Positionsblocks - "Pause"
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 break;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
}
Ergebnis:
# curl example.com/test.txt
finally matched location /
Erläuterung:
In einem Standortblock break
würde flag Folgendes tun ...
- Kein Parsen von Umschreibebedingungen mehr
- Die interne Nginx-Engine analysiert weiterhin den aktuellen
location
Block
Beispiel 4: Innerhalb des Positionsblocks - "last"
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 last;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed, either!
}
location /documents {
echo 'finally matched location /documents';
}
}
Ergebnis:
# curl example.com/test.txt
finally matched location /notes
Erläuterung:
In einem Standortblock last
würde flag Folgendes tun ...
- Kein Parsen von Umschreibebedingungen mehr
- Die interne Nginx-Engine sucht auf der Grundlage des Ergebnisses nach einer anderen Standortübereinstimmung
rewrite
.
- Kein Parsen von Umschreibebedingungen mehr, auch nicht beim nächsten Standort-Match!
Zusammenfassung:
- Wenn eine
rewrite
Bedingung mit der Flagge break
oder last
übereinstimmt, stoppt Nginx das Parsen nicht mehr rewrites
!
- Außerhalb eines Standortblocks erledigt Nginx mit
break
oder last
den gleichen Job (stoppt die Verarbeitung weiterer Umschreibebedingungen).
- Innerhalb eines Standortblocks mit
break
stoppt Nginx nur die Verarbeitung weiterer Umschreibebedingungen
- Innerhalb eines Standortblocks mit
last
stoppt Nginx die Verarbeitung von erneuten Schreibbedingungen und sucht dann nach einem neuen location
Block- Matching ! Nginx ignoriert auch alle rewrites
im neuen location
Block!
Schlussbemerkung:
Ich habe es versäumt, weitere Randfälle einzuschließen (tatsächlich häufiges Problem bei Umschreibungen, wie z. B. 500 internal error
). Aber das würde von dieser Frage ausgeschlossen sein. Wahrscheinlich liegt Beispiel 1 auch außerhalb des Anwendungsbereichs!