nginx url rewriting: Unterschied zwischen break und last

45

Ich verstehe den Unterschied zwischen break und last (Flags of Rewrite) nicht. Die Dokumentation ist eher abstrus. Ich habe versucht, in einigen meiner Konfigurationen zwischen den beiden zu wechseln, konnte jedoch keinen Unterschied im Verhalten feststellen. Kann mir jemand diese Flags bitte näher erläutern? Am besten mit einem Beispiel, das ein anderes Verhalten beim Umblättern einer Flagge in eine andere zeigt.


quelle
Ich kenne die Antwort nicht, aber bitte aktualisiere wiki.nginx.org, wenn du deine Antwort erhältst. Außerdem ist die englischsprachige Nginx-Mailingliste ziemlich aktiv, und Igor (der Hauptentwickler) beantwortet monatlich Hunderte von Fragen. Vielleicht fragen Sie dort.
Malayter
@rmalayter - Diese Frage wurde auf der Nginx-Mailingliste gestellt. Igor antwortete, aber die Antwort ergab auch für mich keinen Sinn: pubbs.net/nginx/200908/46047
Der pubbs.net-Link ist unterbrochen, als die Domain übernommen wurde. Entschuldigung, konnte nicht finden, wo es zeigen sollte. (
Tino

Antworten:

40

Möglicherweise haben Sie unterschiedliche Sätze von Umschreiberegeln für verschiedene Speicherorte. Wenn das Umschreibemodul erfüllt ist last, wird die Verarbeitung des aktuellen Satzes gestoppt und die umgeschriebene Anforderung wird erneut weitergeleitet, um den geeigneten Speicherort (und den neuen Satz von Umschreiberegeln) zu finden. Wenn die Regel mit endet break, wird das Umschreiben ebenfalls beendet, die umgeschriebene Anforderung wird jedoch nicht an einen anderen Speicherort übergeben.

Das heißt, wenn es zwei Speicherorte gibt: loc1 und loc2 und es eine Umschreiberegel in loc1 gibt, die loc1 in loc2 ändert UND mit endet last, wird die Anforderung umgeschrieben und an den Speicherort loc2 übergeben. Wenn die Regel mit endet break, gehört sie zum Standort loc1.

minaev
quelle
Sie meinen, wenn das Umschreiben das Unterbrechungskennzeichen hat, wird nicht nach einem passenden Ortsblock gesucht, wodurch dieser zum Ort loc1 gehört.
Martin Fjordvald
Genau. Fest.
Minaev
43

OP bevorzugte ein Beispiel. Auch was @minaev schrieb, war nur ein Teil der Geschichte! Auf geht's...

Beispiel 1: Keine (break oder last) Flags

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;
}

Ergebnis:

# curl example.com/test.txt
finally matched location /documents

Erläuterung:

Denn rewritedie Flags sind optional!

Beispiel 2: Außerhalb des Standortblocks (Pause oder Letzte)

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
}

Ergebnis:

# curl example.com/test.txt
finally matched location /notes

Erläuterung:

Außerhalb des Standortblocks verhalten sich beide breakund lastgenau so ...

  • Kein Parsen von Umschreibebedingungen mehr
  • Nginx Internal Engine geht zur nächsten Phase (Suche nach locationÜbereinstimmung)

Beispiel 3: Innerhalb des Positionsblocks - "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';
    }
}

Ergebnis:

# curl example.com/test.txt
finally matched location /

Erläuterung:

In einem Standortblock breakwürde flag Folgendes tun ...

  • Kein Parsen von Umschreibebedingungen mehr
  • Die interne Nginx-Engine analysiert weiterhin den aktuellen locationBlock

Beispiel 4: Innerhalb des Positionsblocks - "last"

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';
    }
}

Ergebnis:

# curl example.com/test.txt
finally matched location /notes

Erläuterung:

In einem Standortblock lastwürde flag Folgendes tun ...

  • Kein Parsen von Umschreibebedingungen mehr
  • Die interne Nginx-Engine sucht auf der Grundlage des Ergebnisses nach einer anderen Standortübereinstimmung rewrite.
  • Kein Parsen von Umschreibebedingungen mehr, auch nicht beim nächsten Standort-Match!

Zusammenfassung:

  • Wenn eine rewriteBedingung mit der Flagge breakoder lastübereinstimmt, stoppt Nginx das Parsen nicht mehr rewrites!
  • Außerhalb eines Standortblocks erledigt Nginx mit breakoder lastden gleichen Job (stoppt die Verarbeitung weiterer Umschreibebedingungen).
  • Innerhalb eines Standortblocks mit breakstoppt Nginx nur die Verarbeitung weiterer Umschreibebedingungen
  • Innerhalb eines Standortblocks mit laststoppt Nginx die Verarbeitung von erneuten Schreibbedingungen und sucht dann nach einem neuen locationBlock- Matching ! Nginx ignoriert auch alle rewritesim neuen locationBlock!

Schlussbemerkung:

Ich habe es versäumt, weitere Randfälle einzuschließen (tatsächlich häufiges Problem bei Umschreibungen, wie z. B. 500 internal error). Aber das würde von dieser Frage ausgeschlossen sein. Wahrscheinlich liegt Beispiel 1 auch außerhalb des Anwendungsbereichs!

Pothi Kalimuthu
quelle
ERROR : „nginx.service schlug fehl , da der Steuerprozess mit dem Fehlercode beendet.“ ... unbekannte Direktive „Echo“
Peter Krauss
nginx.com/resources/wiki/modules/echo . Einige Linux-Distributionen wie Ubuntu 14.04 oder höher enthalten dieses Modul in bestimmten Paketen (z. B. in nginx-extras). Ich hoffe das hilft.
Pothi Kalimuthu
1
In Beispiel 1 würde es einen Unterschied machen, wenn die Umschreiberegeln über allen drei Standortrichtlinien stehen würden.
Craig Hicks
1
@CraigHicks Nein, das würde es nicht. Eine Umschreiberegel hat eine höhere Priorität und wird zuerst ausgeführt, bevor die Positionen abgeglichen werden.
Pothi Kalimuthu
1
Dies sollte die beste Antwort sein. Es ist leicht zu verstehen, wenn Sie sich auf diese Beispiele beziehen und die nginx-Dokumentation lesen.
Don Dilanga