BLOG | NGINX

Ein regulärer Ausdruckstester für NGINX und NGINX Plus

NGINX-Teil-von-F5-horiz-schwarz-Typ-RGB
Rick Nelson Miniaturbild
Rick Nelson
Veröffentlicht am 11. Juni 2019

Während ich an einem regulären Ausdruck (Regex) zur Verwendung mit NGINX arbeitete, kam mir eine Idee, wie man einen Regex einfach innerhalb einer tatsächlichen NGINX-Konfiguration testen könnte. (Der Regex-Tester funktioniert für NGINX Open Source und NGINX Plus genauso, und der einfacheren Lesbarkeit halber beziehe ich mich in diesem Beitrag einfach auf NGINX .)

Die Unterstützung regulärer Ausdrücke ist eine der leistungsstarken Funktionen von NGINX, allerdings können reguläre Ausdrücke komplex und schwierig richtig zu handhaben sein, insbesondere wenn Sie nicht regelmäßig mit ihnen arbeiten. NGINX erlaubt reguläre Ausdrücke in mehreren Teilen einer Konfiguration, beispielsweise Standorten, Karten, Umschreibungen und Servernamen. Der hier beschriebene Tester ist für reguläre Ausdrücke in Standorten und Karten.

Es gibt andere kostenlose Online-Regex-Tester, die für die meisten Regex gut sind, aber NGINX verwendet einige nicht standardmäßige, für Webanwendungen optimierte Verknüpfungen. Beispielsweise müssen Sie den Schrägstrich (/) in einer URI nicht maskieren, wie Sie es in einem Standard-Regex tun. Wenn Sie in einer Karte einen regulären Ausdruck verwenden, geben Sie außerdem an, welcher Wert basierend auf einer Übereinstimmung festgelegt werden soll. Bei anderen Regex-Testern müssen Sie möglicherweise den regulären Ausdruck ändern oder im Fall einer Karte ableiten, welcher Wert festgelegt wird. Darüber hinaus ist es immer gut, einen regulären Ausdruck mit der tatsächlichen Regex-Engine in der tatsächlichen Umgebung testen zu können.

Hinweise:

  • NGINX verwendet Perl Compatible Regular Expressions (PCRE) und dieser Beitrag setzt ein grundlegendes Verständnis sowohl von NGINX als auch von regulären Ausdrücken voraus. Die Erklärung der Konstruktion regulärer Ausdrücke liegt außerhalb des Rahmens dieses Beitrags und wir bedauern, dass wir im Kommentarbereich keine weiteren Fragen zur Konstruktion regulärer Ausdrücke beantworten können.

    Es gibt zahlreiche Websites, die Tools oder Dokumentationen zum Erstellen regulärer Ausdrücke bereitstellen. Zwei davon haben wir als nützlich empfunden:

  • Der Tester verarbeitet reguläre Ausdrücke in zwei Kontexten – Map{}- Blöcken und HTTP- Location{}- Blöcken – und weiter unten gibt es eine kurze Erläuterung, wie reguläre Ausdrücke in jedem Fall funktionieren. Eine Erklärung, wie NGINX mit regulären Ausdrücken in allen Kontexten umgeht, liegt außerhalb des Rahmens dieses Beitrags; siehe unsere Dokumentation:

  • Der Tester ist bewusst so einfach wie möglich gestaltet und soll einen Zweck erfüllen: das Testen von vom Benutzer geschriebenen Regexen unter Verwendung der aktuellen NGINX-Regex-Engine für Karten und HTTP-Standorte. Daher müssen Sie nur eine minimale Menge an Informationen angeben, um eine funktionierende NGINX-Konfiguration zu erstellen. Wir haben nicht vor, Funktionen hinzuzufügen (wie etwa die Validierung des regulären Ausdrucks vor dem Testen), da dies dem Leitprinzip der Einfachheit zuwiderlaufen würde. Wir beheben natürlich gerne Fehler. Senden Sie diese bitte über die Registerkarte „Probleme“ in unserem GitHub-Repository .

Überblick

Bevor wir auf die Details des Regex-Testers eingehen, besprechen wir zunächst, wie Regexe in NGINX-Standorten und -Karten verwendet werden können.

Standorte

Reguläre Ausdrücke in NGINX location{}- Blöcken haben die Form:

Standort -Regex { #... }

Beispielsweise verarbeitet ein location{}- Block mit dem folgenden regulären Ausdruck alle PHP-Anfragen mit einer URI, die mit myapp/ Dateiname .php endet, wie /test/myapp/hello.php und /myapp/hello.php . Das Sternchen nach der Tilde ( ~* ) bewirkt, dass die Groß-/Kleinschreibung nicht beachtet wird.

Standort ~* /myapp/.+\.php$ {
#...
}

NGINX und der Regex-Tester unterstützen Positionserfassungsgruppen in Location{} -Blöcken. Im folgenden Beispiel erfasst die erste Gruppe alles vor dem PHP-Dateinamen und die zweite den PHP-Dateinamen:

Standort ~* (.*/myapp)/(.+\.php)$ {
#...
}

Für die URI /myapp/hello.php wird die Variable $1 auf /myapp und $2 auf hello.php gesetzt.

NGINX unterstützt auch benannte Erfassungsgruppen:

Standort ~* (?<begin>.*myapp)/(?<end>.+\.php)$ {
#...
}

In diesem Fall wird die Variable $begin auf /myapp und $end auf hello.php gesetzt.

Der Regex-Tester unterstützt benannte Erfassungsgruppen, behandelt sie in seiner Ausgabe jedoch wie Positionserfassungsgruppen und zeigt ihre Ordnungszahlen statt ihrer Namen an.

Karten

NGINX- Map{} -Blöcke, die reguläre Ausdrücke verwenden, haben die Form:

zu testende Variable zuordnen zu setzende Variable { regex1 bei Übereinstimmung festzulegender Wert ; regex2 bei Übereinstimmung festzulegender Wert ; #... regexN bei Übereinstimmung festzulegender Wert ; bei keiner Übereinstimmung festzulegender Standardwert ; }

Beispielsweise setzt dieser map{} -Block die Variable $isphp auf1 wenn die URI (wie in der Variable $uri aufgezeichnet) mit .php endet und0 wenn dies nicht der Fall ist (bei der Übereinstimmung wird die Groß-/Kleinschreibung beachtet):

map $uri $isphp {
~\.php$ 1;
Standard 0;
}

Für Karten unterstützen NGINX und der Regex-Tester sowohl positionelle als auch benannte Erfassungsgruppen.

Beispielsweise setzen die folgenden Maps beide die Variable $fileext auf den Wert der Dateierweiterung, der in diesem Beispiel ebenfalls als $1 erfasst wird:

map $uri $fileext { ~*.+\.(.+)$ $1;
    Standard      '';
}

Und als $ext in diesem Beispiel:

map $uri $fileext {
~*.+\.(?<ext>.+)$ $ext;
Standard '';
}

Sie können den Regex-Tester für Map{}- Blöcke sowohl im http{}- als auch im Stream{}- Kontext verwenden, da die Syntax und das Verhalten von Maps in beiden Kontexten gleich sind. Beachten Sie jedoch, dass Sie, wenn sich Ihre Karte im Stream{} -Kontext befindet, nur den Map{}- Block aus der Ausgabe des Testers verwenden können. Weitere Einzelheiten finden Sie im Hinweis weiter unten .

Der reguläre Ausdruckstester

Der Regex-Tester ist in einem Docker-Container mit installiertem NGINX und NGINX Unit implementiert. NGINX Unit stellt zwei Varianten einer PHP-Seite bereit, eine für reguläre Ausdrücke in location{} -Blöcken und die andere für reguläre Ausdrücke in map{} -Blöcken. Die beiden Seiten fordern den Benutzer zu unterschiedlichen Eingaben auf:

  • Standortseite:

    • Der reguläre Ausdruck
    • Groß-/Kleinschreibung beachten
    • Die URI
  • Kartenseite:

    • Der reguläre Ausdruck
    • Groß-/Kleinschreibung beachten
    • Der zu testende Wert (der Wert der Variablen, die der erste Parameter der Map- Direktive ist)
    • Der in der Variable festzulegende Wert, der als zweiter Parameter der Map- Direktive angegeben ist.

Nachdem Sie die Informationen eingegeben haben, klicken Sie auf die Schaltfläche „Test“ . Der Tester generiert die erforderliche NGINX-Konfigurationsdatei, die Konfiguration wird neu geladen und eine Anforderung zum Testen des regulären Ausdrucks wird gesendet. Anschließend werden die Ergebnisse angezeigt und es wird angezeigt, ob eine Übereinstimmung gefunden wurde. Wenn dies der Fall ist, werden auf der Seite „Standorttester“ die Werte der Erfassungsgruppen angezeigt und auf der Seite „Kartentester“ der von der Karte festgelegte Wert gemeldet.

Beispiel für eine Standortseite

Dieses Beispiel zeigt die Ergebnisse eines Tests des regulären Ausdrucks (.*myapp)/(.+\.php)$ unter Berücksichtigung der Groß-/Kleinschreibung gegenüber der URI /myapp/hello.php :

 

Beispiel für eine Kartenseite

Dieses Beispiel zeigt die Ergebnisse eines Tests des regulären Ausdrucks, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wurde. .+\.(?<Erw.>.*)$ gegen den Wert /myapp/hallo.phpmit der benannten Erfassungsgruppe $ext als einzustellender Wert:

 

Notiz: Wenn sich Ihre Karte im Stream{} -Kontext befindet, können Sie in Ihrer Konfiguration nur den Map{}- Block aus der Ausgabe verwenden. Der Server{} -Block ist ungültig, da er einen Location{}- Block enthält, der im Stream{} -Kontext nicht unterstützt wird.

Abschluss

Sie sehen, dass die NGINX-Konfiguration recht kurz und einfach ist. Die harte Arbeit wird von der PHP-Seite erledigt, die basierend auf den vom Benutzer eingegebenen Werten die erforderliche NGINX-Konfigurationsdatei generiert, NGINX neu lädt, eine Anfrage an NGINX sendet und die Ergebnisse anzeigt.

Sie können den Regex-Tester selbst ausprobieren: Der gesamte Code ist in unserem GitHub-Repo verfügbar ( https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester ).

Um die Inbetriebnahme des Regex-Testers zu erleichtern, sind alle erforderlichen Dateien enthalten. Um das Docker-Image und den Container zu erstellen, führen Sie einfach Folgendes aus:

$ docker-compose up -d

Richten Sie Ihren Browser dann auf http: //Docker-host/regextester.php .

Ich hoffe, Sie finden Tester bei der Verwendung von regulären Ausdrücken hilfreich und erhalten einen Einblick in die Leistungsfähigkeit, Flexibilität und Einfachheit von NGINX.

Um den Regex-Tester mit NGINX Plus auszuprobieren, starten Sie noch heute Ihre kostenlose 30-Tage-Testversion oder kontaktieren Sie uns, um Ihre Anwendungsfälle zu besprechen .


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."