Je ne comprends pas la différence entre break et last (drapeaux de réécriture). La documentation est plutôt absconse. J'ai essayé de passer de l'un à l'autre dans certaines de mes configurations, mais je n'ai pu déceler aucune différence de comportement. Quelqu'un peut-il expliquer ces drapeaux plus en détail ? De préférence avec un exemple qui montre un comportement différent lorsqu'on bascule d'un drapeau à l'autre.
Réponses
Trop de publicités?L'OP a préféré un exemple. De plus, ce que @minaev a écrit, n'était qu'une partie de l'histoire ! Donc, nous y voilà...
Exemple 1 : Aucun drapeau (de rupture ou de fin)
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 facultatifs !
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
y last
se comportent exactement de la même manière...
- plus d'analyse des conditions de réécriture
- Le moteur interne de Nginx passe à la phase suivante (recherche de
location
match)
Exemple 3 : Bloc d'emplacement intérieur - "break" (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 :
A l'intérieur d'un bloc d'emplacement, break
flag ferait ce qui suit...
- plus d'analyse des conditions de réécriture
- Le moteur interne de Nginx continue à analyser l'adresse actuelle de l'utilisateur.
location
bloc
Exemple 4 : Bloc d'emplacement intérieur - "last" (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 :
A l'intérieur d'un bloc d'emplacement, last
flag ferait ce qui suit...
- plus d'analyse des conditions de réécriture
- Moteur interne Nginx commence à regarder pour une autre correspondance d'emplacement basée sur le résultat de la
rewrite
résultat. - plus d'analyse des conditions de réécriture, même sur la prochaine correspondance d'emplacement !
Résumé :
- Lorsqu'un
rewrite
condition avec le drapeaubreak
olast
correspond, Nginx arrête d'analyser les autres éléments suivantsrewrites
! - En dehors d'un bloc d'emplacement, avec
break
olast
Nginx fait le même travail (il arrête de traiter les conditions de réécriture). - À l'intérieur d'un bloc d'emplacement, avec
break
Nginx ne cesse de traiter que les conditions de réécriture. - À l'intérieur d'un bloc d'emplacement, avec
last
Nginx arrête de traiter toutes les conditions de réécriture et ensuite commence à regarder pour une nouvelle correspondance delocation
bloc ! Nginx ignore également touterewrites
dans le nouveaulocation
bloc !
Note finale :
J'ai omis d'inclure d'autres cas limites (en fait, il s'agit d'un problème commun aux réécritures, tel que 500 internal error
). Mais, ce serait hors de portée de cette question. Probablement, l'exemple 1 est également hors sujet !
Vous pouvez avoir différents ensembles de règles de réécriture pour différents emplacements. Lorsque le module de réécriture rencontre last
il arrête de traiter l'ensemble actuel et la requête réécrite est transmise une nouvelle fois pour trouver l'emplacement approprié (et le nouvel ensemble de règles de réécriture). Si la règle se termine par break
la réécriture s'arrête également, mais la demande réécrite n'est pas transmise à un autre endroit.
Autrement dit, s'il y a deux emplacements : loc1 et loc2, et qu'il y a une règle de réécriture dans loc1 qui change loc1 en loc2 ET qui se termine par last
la demande sera réécrite et transmise à l'emplacement loc2. Si la règle se termine par break
il appartiendra à l'emplacement loc1.