OP a préféré un exemple. En outre, ce que @minaev a écrit n'était qu'une partie de l'histoire! Alors on y va ...
Exemple 1: aucun drapeau (pause ou dernier)
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;
}
Résultat:
# curl example.com/test.txt
finally matched location /documents
Explication:
Pour rewrite
, les drapeaux sont optionnels!
Exemple 2: bloc d'emplacement extérieur (pause ou dernier)
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
}
Résultat:
# curl example.com/test.txt
finally matched location /notes
Explication:
En dehors du bloc d'emplacement, les deux break
et last
se comportent de la manière exacte ...
- plus d'analyse des conditions de réécriture
- Le moteur interne de Nginx passe à la phase suivante (recherche d'une
location
correspondance)
Exemple 3: Bloc de localisation interne - "pause"
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';
}
}
Résultat:
# curl example.com/test.txt
finally matched location /
Explication:
Dans un bloc d'emplacement, break
flag ferait ce qui suit ...
- plus d'analyse des conditions de réécriture
- Le moteur interne de Nginx continue d'analyser le
location
bloc actuel
Exemple 4: bloc de lieu intérieur - "dernier"
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';
}
}
Résultat:
# curl example.com/test.txt
finally matched location /notes
Explication:
Dans un bloc d'emplacement, last
flag ferait ce qui suit ...
- plus d'analyse des conditions de réécriture
- Le moteur interne de Nginx commence à rechercher une autre correspondance d'emplacement en fonction du résultat du
rewrite
résultat.
- plus d'analyse des conditions de réécriture, même lors du prochain match de localisation!
Sommaire:
- Lorsqu'une
rewrite
condition avec le drapeau break
ou last
correspond, Nginx cesse d'analyser plus rewrites
!
- En dehors d'un bloc d'emplacement, avec
break
ou last
, Nginx effectue le même travail (cesse de traiter les conditions de réécriture).
- Dans un bloc d'emplacement, avec
break
, Nginx n'interrompt que le traitement des conditions de réécriture
- Dans un bloc d’emplacement, avec
last
, Nginx arrête de traiter les conditions de réécriture et commence ensuite à rechercher une nouvelle correspondance de location
bloc! Nginx en ignore également tous les éléments rewrites
dans le nouveau location
bloc!
Note finale:
J'ai manqué d'inclure quelques cas supplémentaires (problème courant avec les réécritures, tel que 500 internal error
). Mais ce serait hors de portée de cette question. Probablement, l'exemple 1 est également hors de propos!