83 votes

nginx url rewriting : différence entre break et last

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.

95voto

Pothi Kalimuthu Points 5514

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 drapeau break o last correspond, Nginx arrête d'analyser les autres éléments suivants rewrites !
  • En dehors d'un bloc d'emplacement, avec break o last 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 de location bloc ! Nginx ignore également toute rewrites dans le nouveau location 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 !

63voto

Miles Wolbe Points 736

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X