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 break
y se last
comportan 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
location
coincidencias)
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 break
bandera haría lo siguiente ...
- no más análisis de las condiciones de reescritura
- El motor interno de Nginx continúa analizando el
location
bloque 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 last
bandera 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
rewrite
resultado.
- ¡No más análisis de las condiciones de reescritura, incluso en la próxima coincidencia de ubicación!
Resumen:
- Cuando una
rewrite
condición con la bandera break
o last
coincide, ¡Nginx deja de analizar más rewrites
!
- Fuera de un bloque de ubicación, con
break
o 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 location
bloque. ¡Nginx también ignora a cualquiera rewrites
en el nuevo location
bloque!
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!