Frage nginx url rewriting: Unterschied zwischen Pause und Leisten


Ich verstehe den Unterschied zwischen Pause und Leisten nicht (Flaggen des Neuschreibens). Die Dokumentation ist eher abstrus. Ich habe versucht, in einigen meiner Konfigurationen zwischen den beiden zu wechseln, aber ich konnte keinen Unterschied im Verhalten feststellen. Kann jemand bitte diese Flaggen genauer erklären? Am besten mit einem Beispiel, das beim Umklappen eines Flags ein anderes Verhalten zeigt.


34
2018-04-12 00:21


Ursprung


Ich kenne die Antwort nicht, aber bitte aktualisieren Sie die wiki.ninx.org, wenn Sie Ihre Antwort erhalten. Auch die englischsprachige nginx-Mailing-Liste ist ziemlich aktiv, und Igor (der Hauptentwickler) beantwortet Hunderte von Fragen pro Monat, also fragt vielleicht dort. - rmalayter
@rmalayter - Diese Frage wurde auf der nginx-Mailingliste gestellt. Igor antwortete darauf, aber die Antwort machte mir auch keinen Sinn: pubbs.net/nginx/200908/46047
Der Link pubbs.net ist beschädigt, da die Domain übernommen wurde. Sorry, konnte nicht finden, wo es zeigen sollte. ( - Tino


Antworten:


Sie können verschiedene Sätze von Rewrite-Regeln für verschiedene Standorte haben. Wenn Neuschreibmodul trifft lastEs hört auf, den aktuellen Satz zu verarbeiten, und die umgeschriebene Anforderung wird erneut übergeben, um den geeigneten Ort (und den neuen Satz von Umschreibungsregeln) zu finden. Wenn die Regel endet mit breakDas Überschreiben wird ebenfalls gestoppt, aber die umgeschriebene Anforderung wird nicht an einen anderen Speicherort übergeben.

Das heißt, wenn es zwei Orte gibt: loc1 und loc2, und es gibt eine Umschreibungsregel in loc1, die loc1 in loc2 ändert UND mit endet lastwird die Anfrage umgeschrieben und an den Ort loc2 übergeben. Wenn die Regel endet mit break, es wird zum Standort loc1 gehören.


35
2018-04-14 14:25



Sie meinen, wenn das Umschreiben das Unterbrechungsflag hat, wird es nicht nach einem passenden Standortblock suchen, wodurch es zum Standort loc1 gehört. - Martin Fjordvald
Genau. Fest. - minaev


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

Beispiel 1: Nein (Pause oder letzte) 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:

Zum rewriteDie Flaggen sind optional!

Beispiel 2: Externer Standortblock (Pause oder Leisten)

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 beide break und last sich genau verhalten ...

  • kein Parsing der Umschreibbedingungen mehr
  • Der interne Nginx-Motor geht in die nächste Phase (Suche nach location Spiel)

Beispiel 3: Innerhalb des Standortblocks - "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 break Flagge würde folgendes tun ...

  • kein Parsing der Umschreibbedingungen mehr
  • Die interne Nginx-Engine parst weiterhin den Strom location Block

Beispiel 4: Innerhalb des Standortblocks - "zuletzt"

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 last Flagge würde folgendes tun ...

  • kein Parsing der Umschreibbedingungen mehr
  • Nginx interner Motor beginnt zu schauen für eine andere Standortübereinstimmung basierend auf dem Ergebnis der rewrite Ergebnis.
  • kein erneutes Parsen der Umschreibbedingungen, selbst bei der nächsten Standortübereinstimmung!

Zusammenfassung:

  • Wenn ein rewrite Zustand mit der Flagge break oder last Übereinstimmungen, Nginx hört auf, mehr zu analysieren rewrites!
  • Außerhalb eines Standortblocks mit break oder last, Nginx macht den gleichen Job (stoppt die Verarbeitung von Bedingungen zum erneuten Schreiben).
  • Innerhalb eines Standortblocks mit break, Nginx beendet nur die Verarbeitung von Bedingungen zum erneuten Schreiben
  • Innerhalb eines Standortblocks mit last, Nginx beendet die Verarbeitung der Bedingungen zum erneuten Schreiben und dann beginnt zu schauen für ein neues Matching von location Block! Nginx ignoriert auch alle rewrites im neuen location Block!

Letzter Hinweis:

Ich habe es versäumt, einige weitere Randfälle einzubeziehen (tatsächlich häufiges Problem mit Umschreibungen, wie z 500 internal error). Aber das wäre außerhalb der Reichweite dieser Frage. Wahrscheinlich ist auch Beispiel 1 außerhalb des Geltungsbereichs!


29
2018-01-28 14:13



ERROR: "nginx.service ist fehlgeschlagen, weil der Steuerungsprozess mit dem Fehlercode beendet wurde." ... unbekannte Anweisung "echo" - Peter Krauss
nginx.com/resources/wiki/modules/echo . Einige Linux-Distributionen wie Ubuntu ab 14.04 bündeln dieses Modul in bestimmten Paketen (zB in nginx-extras). Ich hoffe das hilft. - Pothi Kalimuthu
In Beispiel 1 würde es einen Unterschied machen, wenn die Umschreiberegeln über die drei Ortsrichtlinien gesetzt würden? - Craig Hicks
@CraigHicks Nein, würde es nicht. Eine Rewrite-Regel hat eine höhere Priorität und wird zuerst ausgeführt, bevor die Standorte übereinstimmen. - Pothi Kalimuthu