OP prefirió un ejemplo. Además, ¡lo que escribió @minaev fue solo una parte de la historia! Así que, aquí vamos...
Ejemplo 1: sin banderas (interrupción o ú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
Explicación:
¡Para rewrite, las banderas son opcionales!
Ejemplo 2: bloque de ubicación exterior (descanso o ú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
Explicación:
Fuera del bloque de ubicación, ambos breaky se lastcomportan de la manera exacta ...
- no más análisis de las condiciones de reescritura
- El motor interno de Nginx pasa a la siguiente fase (búsqueda de
locationcoincidencias)
Ejemplo 3: Bloque de ubicación interior - "descanso"
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 /
Explicación:
Dentro de un bloque de ubicación, la breakbandera haría lo siguiente ...
- no más análisis de las condiciones de reescritura
- El motor interno de Nginx continúa analizando el
locationbloque actual
Ejemplo 4: Bloque de ubicación interior - "último"
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
Explicación:
Dentro de un bloque de ubicación, la lastbandera haría lo siguiente ...
- no más análisis de las condiciones de reescritura
- El motor interno de Nginx comienza a buscar otra coincidencia de ubicación en función del resultado del
rewriteresultado.
- ¡No más análisis de las condiciones de reescritura, incluso en la próxima coincidencia de ubicación!
Resumen:
- Cuando una
rewritecondición con la bandera breako lastcoincide, ¡Nginx deja de analizar más rewrites!
- Fuera de un bloque de ubicación, con
breako last, Nginx hace el mismo trabajo (deja de procesar las condiciones de reescritura).
- Dentro de un bloque de ubicación, con
break, Nginx solo deja de procesar las condiciones de reescritura.
- Dentro de un bloque de ubicación, con
last, Nginx deja de procesar las condiciones de reescritura y luego comienza a buscar una nueva coincidencia de locationbloque. ¡Nginx también ignora a cualquiera rewritesen el nuevo locationbloque!
Nota final:
Olvidé incluir algunos casos más extremos (en realidad, un problema común con reescrituras, como 500 internal error). Pero eso estaría fuera del alcance de esta pregunta. ¡Probablemente, el ejemplo 1 también está fuera de alcance!