O OP preferiu um exemplo. Além disso, o que @minaev escreveu, era apenas uma parte da história! Aqui vamos nos...
Exemplo 1: Nenhum sinalizador (interrupção ou último)
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;
}
Resultado:
# curl example.com/test.txt
finally matched location /documents
Explicação:
Pois rewrite, as bandeiras são opcionais!
Exemplo 2: Bloco de localização externo (pausa ou último)
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
}
Resultado:
# curl example.com/test.txt
finally matched location /notes
Explicação:
Fora do bloco de localização, ambos breake lastse comportam da maneira exata ...
- não é mais necessário analisar as condições de reescrita
- O mecanismo interno do Nginx passa para a próxima fase (procurando por
locationcorrespondência)
Exemplo 3: Bloco de localização interno - "pausa"
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';
}
}
Resultado:
# curl example.com/test.txt
finally matched location /
Explicação:
Dentro de um bloco de localização, o breaksinalizador faria o seguinte ...
- não é mais necessário analisar as condições de reescrita
- O mecanismo interno do Nginx continua analisando o
locationbloco atual
Exemplo 4: Bloco de localização interno - "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';
}
}
Resultado:
# curl example.com/test.txt
finally matched location /notes
Explicação:
Dentro de um bloco de localização, o lastsinalizador faria o seguinte ...
- não é mais necessário analisar as condições de reescrita
- O mecanismo interno do Nginx começa a procurar outra correspondência de local com base no resultado do
rewriteresultado.
- não é mais necessário analisar as condições de reescrita, mesmo na próxima partida de localização!
Resumo:
- Quando uma
rewritecondição com a bandeira breakou lastcorresponde, o Nginx para de analisar mais rewrites!
- Fora de um bloco de localização, com
breakou last, o Nginx faz o mesmo trabalho (para de processar mais as condições de reescrita).
- Dentro de um bloco de localização, com
break, o Nginx só para de processar mais condições de reescrita
- Dentro de um bloco de localização, com
last, o Nginx para de processar mais as condições de reescrita e começa a procurar uma nova correspondência de locationbloco! Nginx também ignora qualquer um rewritesno novo locationbloco!
Nota final:
Eu esqueci de incluir mais alguns casos extremos (problema realmente comum com reescritas, como 500 internal error). Mas isso estaria fora do escopo desta questão. Provavelmente, o exemplo 1 também está fora do escopo!