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 break
e last
se 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
location
correspondê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 break
sinalizador faria o seguinte ...
- não é mais necessário analisar as condições de reescrita
- O mecanismo interno do Nginx continua analisando o
location
bloco 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 last
sinalizador 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
rewrite
resultado.
- não é mais necessário analisar as condições de reescrita, mesmo na próxima partida de localização!
Resumo:
- Quando uma
rewrite
condição com a bandeira break
ou last
corresponde, o Nginx para de analisar mais rewrites
!
- Fora de um bloco de localização, com
break
ou 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 location
bloco! Nginx também ignora qualquer um rewrites
no novo location
bloco!
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!