OP ha preferito un esempio. Inoltre, ciò che ha scritto @minaev era solo una parte della storia! Quindi, eccoci qui ...
Esempio 1: nessun flag (break o last)
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;
}
Risultato:
# curl example.com/test.txt
finally matched location /documents
Spiegazione:
Per rewrite
, le bandiere sono opzionali!
Esempio 2: blocco posizione esterna (interruzione o ultimo)
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
}
Risultato:
# curl example.com/test.txt
finally matched location /notes
Spiegazione:
Al di fuori del blocco posizione, entrambi break
e si last
comportano esattamente ...
- non più analisi delle condizioni di riscrittura
- Il motore interno di Nginx passa alla fase successiva (ricerca della
location
corrispondenza)
Esempio 3: blocco di posizione interno - "interruzione"
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';
}
}
Risultato:
# curl example.com/test.txt
finally matched location /
Spiegazione:
All'interno di un blocco di posizione, break
flag farebbe il seguente ...
- non più analisi delle condizioni di riscrittura
- Il motore interno di Nginx continua ad analizzare il
location
blocco corrente
Esempio 4: blocco posizione interno - "ultimo"
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';
}
}
Risultato:
# curl example.com/test.txt
finally matched location /notes
Spiegazione:
All'interno di un blocco di posizione, last
flag farebbe il seguente ...
- non più analisi delle condizioni di riscrittura
- Il motore interno di Nginx inizia a cercare un'altra corrispondenza di posizione in base al risultato del
rewrite
risultato.
- non sarà più necessario analizzare le condizioni di riscrittura, anche nella prossima posizione corrispondente!
Sommario:
- Quando una
rewrite
condizione con la bandiera break
o le last
partite, Nginx smette di analizzare più rewrites
!
- Al di fuori di un blocco di posizione, con
break
o last
, Nginx fa lo stesso lavoro (interrompe l'elaborazione delle condizioni di riscrittura).
- All'interno di un blocco di posizione, con
break
, Nginx interrompe l'elaborazione delle condizioni di riscrittura
- All'interno di un blocco di posizione, con
last
Nginx interrompe l'elaborazione delle condizioni di riscrittura e quindi inizia a cercare una nuova corrispondenza del location
blocco! Nginx ignora anche quelli rewrites
nel nuovo location
blocco!
Nota finale:
Ho perso di includere alcuni casi limite (in realtà un problema comune con le riscritture, come 500 internal error
). Ma sarebbe fuori dalla portata di questa domanda. Probabilmente, anche l'esempio 1 è fuori portata!