Beispiele für Nginx Rewrite URL Regeln

NGINX Rewrite-Regeln werden verwendet, um die gesamte oder einen Teil der URL, die von einem Client angefordert wurde, zu ändern. Das Hauptmotiv für die Änderung einer URL besteht darin, den Clients mitzuteilen, dass sich der Standort der von ihnen gesuchten Ressourcen geändert hat, abgesehen davon, den Fluss der Ausführungsseiten in NGINX zu steuern. Die Return- und Rewrite-Direktiven in NGINX werden verwendet, um die URL umzuschreiben. Beide Direktiven führen die gleiche Funktion des URL-Umschreibens aus. Die Rewrite-Direktive ist jedoch mächtiger als die Return-Direktive, da komplexes Umschreiben, das das Parsen der URL erfordert, nur mit der Rewrite-Direktive durchgeführt werden kann. In diesem Tutorial werden wir untersuchen, wie sowohl Return- als auch Rewrite-Direktiven in NGINX verwendet werden, um die URL zu ändern oder umzuschreiben.

NGINX Return-Direktive

Die einfachste und sauberste Art, eine URL umzuschreiben, kann mit der Return-Direktive durchgeführt werden. Die Return-Direktive muss im Server- oder Location-Kontext deklariert werden, indem die umzuleitende URL angegeben wird.

1. NGINX Return-Direktive im Server-Kontext

Die Return-Direktive im Server-Kontext ist sehr nützlich in einer Situation, in der Sie Ihre Website auf eine neue Domain migriert haben und alle alten URLs auf die neue Domain umleiten möchten. Darüber hinaus hilft es auch bei der Kanonisierung von URLs, indem Ihre Website gezwungen wird, entweder zur www- oder zur Nicht-www-Version umzuleiten.

server {
        listen 80;
        server_name www.olddomain.com;
        return 301 $scheme://www.newdomain.com$request_uri;
}

Die Return-Direktive im obigen Server-Kontext leitet URLs, die für die Website www.olddomain.com bestimmt sind, auf www.newdomain.com um. Sobald NGINX eine URL mit www.olddomain.com erhält, stoppt es die Verarbeitung der Seite und sendet einen 301-Antwortcode zusammen mit der umgeschriebenen URL an den Client. Die beiden Variablen, die in der obigen Return-Direktive verwendet werden, sind $scheme und $request_uri. Die Variable $scheme wird verwendet, um das Schema der URL (http oder https) zu definieren, und die Variable $request_uri enthält die komplette URI mit Parametern, falls vorhanden. Denken Sie daran, dass beide Variablen diese Informationen aus der Eingabe-URL beim Umschreiben der URL abrufen.

2. Return-Direktive im Location-Kontext

In einigen Situationen möchten Sie möglicherweise Seiten umleiten, anstatt Domains umzuleiten. Die Return-Direktive innerhalb des Location-Blocks ermöglicht es Ihnen, bestimmte Seiten an einen neuen Ort umzuleiten.

location = /tutorial/learning-nginx {
     return 301 $scheme://example.com/nginx/understanding-nginx
}

Im obigen Beispiel wird jedes Mal, wenn eine Anforderungs-URI genau mit dem Muster /tutorial/learning-nginx übereinstimmt, NGINX dieselbe an den neuen Standort https://example.com/nginx/understanding-nginx umleiten. Sie können auch alles für einen bestimmten Pfad an einen neuen Ort umleiten. Das folgende Beispiel zeigt, wie alle Seiten, die unter /tutorial fallen, an https://example.com/articles umgeleitet werden.

location /tutorial {
     return 301 $scheme://example.com/articles
}

NGINX Rewrite-Direktive

Wir können auch die Rewrite-Direktive verwenden, um URLs in NGINX umzuschreiben. Wie die Return-Direktive kann auch die Rewrite-Direktive sowohl im Server-Kontext als auch im Location-Kontext platziert werden. Die Rewrite-Direktive kann komplizierte Unterscheidungen zwischen URLs vornehmen und Elemente aus der ursprünglichen URL abrufen, die keine entsprechenden NGINX-Variablen haben, wodurch sie nützlicher ist als die Return-Direktive. Die Syntax der Rewrite-Direktive ist:

rewrite regex replacement-url [flag];

regex: Der PCRE-basierte reguläre Ausdruck, der verwendet wird, um mit der eingehenden Anforderungs-URI übereinzustimmen.

replacement-url: Wenn der reguläre Ausdruck mit der angeforderten URI übereinstimmt, wird die Ersatzzeichenfolge verwendet, um die angeforderte URI zu ändern.

flag: Der Wert der Flagge entscheidet, ob eine weitere Verarbeitung der Rewrite-Direktive benötigt wird oder nicht.

Denken Sie daran, dass die Rewrite-Direktive nur den Code 301 oder 302 zurückgeben kann. Um andere Codes zurückzugeben, müssen Sie explizit eine Return-Direktive nach der Rewrite-Direktive einschließen

Beispiele für NGINX Rewrite-Direktiven

Lassen Sie uns schnell einige Rewrite-Regeln überprüfen, um Ihnen den Einstieg zu erleichtern, angefangen beim Umschreiben einer einfachen HTML-Seite zu einer anderen URL:

1. Statische Seite umschreiben

Betrachten Sie ein Szenario, in dem Sie eine URL für eine Seite sagen möchten https://example.com/nginx-tutorial zu https://example.com/somePage.html umschreiben möchten. Die Rewrite-Direktive dafür wird im folgenden Location-Block angegeben.

server {
          ...
          location = /nginx-tutorial 
          { 
            rewrite ^/nginx-tutorial?$ /somePage.html break; 
          }
          ...
}

Erklärung:

  • Die Location-Direktive location = /nginx-tutorial teilt uns mit, dass der Location-Block nur mit einer URL übereinstimmen wird, die den genauen Präfix enthält, der /nginx-tutorial ist.
  • NGINX wird nach dem Muster ^/nginx-tutorial?$ in der angeforderten URL suchen.
  • Um das Muster zu definieren, werden die Zeichen ^,? und $ verwendet und haben eine spezielle Bedeutung.
  • ^ repräsentiert den Beginn der zu vergleichenden Zeichenfolge.
  • $ repräsentiert das Ende der zu vergleichenden Zeichenfolge.
  • ? repräsentiert den nicht gierigen Modifikator. Der nicht gierige Modifikator wird die Suche nach einem Muster beenden, sobald ein Treffer gefunden wurde.
  • Wenn die angeforderte URI das oben genannte Muster enthält, wird somePage.html als Ersatz verwendet.
  • Da die Rewrite-Regel mit einem break endet, stoppt auch das Umschreiben, aber die umgeschriebene Anforderung wird nicht an einen anderen Ort weitergeleitet.

2. Dynamische Seite umschreiben

Betrachten Sie nun eine dynamische Seite https://www.example.com/user.php?id=11, bei der der dynamische Teil id=11 (Benutzer-ID) ist. Wir möchten, dass die URL zu https://exampleshop.com/user/11 umgeschrieben wird. Wenn Sie 10 Benutzer haben, dann besteht die Notwendigkeit von 10 Rewrite-Regeln für jeden Benutzer, wenn Sie die letzte Methode des Umschreibens von URLs verfolgen. Stattdessen ist es möglich, Elemente der URL in Variablen zu erfassen und sie zu verwenden, um eine einzige Rewrite-Regel zu konstruieren, die sich um alle dynamischen Seiten kümmert.

server {
          ...
          location = /user.php 
          { 
            rewrite user.php?id=$1 ^user/([0-9]+)/?$ break; 
          }
          ...
}

Erklärung:

  • Die Location-Direktive location = /user sagt NGINX, dass der Location-Block mit einer URL übereinstimmen soll, die genau das Präfix /user enthält.
  • NGINX wird nach dem Muster ^user/([0-9]+)/?$ in der angeforderten URL suchen.
  • Der reguläre Ausdruck innerhalb der eckigen Klammern [0-9]+ enthält einen Bereich von Zeichen zwischen 0 und 9. Das Pluszeichen bedeutet, dass eines oder mehrere der vorhergehenden Zeichen übereinstimmen. Ohne das Pluszeichen würde der obige reguläre Ausdruck nur mit einem Zeichen wie 5 oder 8 übereinstimmen, aber nicht mit 25 oder 44.
  • Die Klammer ( ) im regulären Ausdruck bezieht sich auf die Rückreferenz. Das $1 in der Ersatz-URL user.php?id=$1 bezieht sich auf diese Rückreferenz.
  • Beispielsweise, wenn https://www.example.com/user/24 die Eingabe-URL ist, dann wird die Benutzer-ID 24 mit dem Bereich in der Rückreferenz übereinstimmen, was zur folgenden Substitution führt: https://www.example.com/user.php?id=24

3. Fortgeschrittenes URL-Umschreiben

Lassen Sie uns mit einem weiteren Beispiel fortfahren, bei dem wir die URL https://www.example.com/user.php?user_name=john umschreiben möchten zu https://www.example.com/user/login/john. Im Gegensatz zur vorherigen Rewrite-Regel enthält der dynamische Teil der URL user_name=john nun einen Bereich von alphabetischen Zeichen. Die Rewrite-Regel für dieses Szenario ist wie folgt gegeben:

server {
          ...
          location = /user.php 
            { 
                rewrite user.php?user_name=$1 ^user/login/([a-z]+)/?$ break;           
            }
          ...
}

Erklärung:

  • Die Location-Direktive location = /user/login/john sagt NGINX, dass der Location-Block mit einer URL übereinstimmen soll, die genau das Präfix /user/login/john enthält.
  • NGINX wird nach dem Muster ^user/login/([a-z]+)/?$ in der angeforderten URL suchen.
  • Der reguläre Ausdruck innerhalb der eckigen Klammern [a-z]+ enthält einen Bereich von Zeichen von a bis z. Das Pluszeichen bedeutet, dass eines oder mehrere der vorhergehenden Zeichen übereinstimmen. Ohne Pluszeichen würde der obige reguläre Ausdruck nur mit einem Zeichen wie a oder c übereinstimmen, aber nicht mit john oder doe.
  • Die Klammer ( ) im regulären Ausdruck bezieht sich auf die Rückreferenz. Das $1 in der Ersatz-URL user.php?user_name=$1 bezieht sich auf diese Rückreferenz.
  • Beispielsweise, wenn die Eingabe-URL https://www.example.com/user/login/john ist, dann wird der Benutzername „john“ mit dem Bereich in der Rückreferenz übereinstimmen, was zur folgenden Substitution führt: https://www.example.com/user.php?user_name=john

4. Umschreiben mit mehreren Rückreferenzen

In diesem Beispiel werden wir auch herausfinden, wie man eine URL durch die Verwendung mehrerer Rückreferenzen umschreibt. Nehmen wir an, die Eingabe-URL ist https://example.com/tutorial/linux/wordpress/file1 und wir möchten die URL zu https://example.com/tutorial/linux/cms/file1.php umschreiben. Wenn Sie die Eingabe-URL genau betrachten, beginnt sie mit /tutorial, und irgendwo später im Pfad muss die Zeichenfolge wordpress durch die Zeichenfolge cms ersetzt werden. Weiterhin muss am Ende des Dateinamens eine Dateierweiterung (php) angehängt werden. Die Umschreibregel für dieses Szenario ist unten gegeben:

server {
          ...
          location /tutorial
          {
             rewrite ^(/tutorial/.*)/wordpress/(\w+)\.?.*$ $1/cms/$2.php last;
          }
          ...
}

Erklärung:

  • Die erste Rückreferenz ^(/tutorial/.*) im regulären Ausdruck wird verwendet, um jede Eingabe-URL zu finden, die mit /tutorial/foo beginnt
  • Die zweite Rückreferenz (\w+) wird verwendet, um nur den Dateinamen ohne Erweiterung zu erfassen.
  • Die obigen zwei Rückreferenzen werden in der Ersatz-URL unter Verwendung von $1 und $2 verwendet
  • Das Schlüsselwort last weist NGINX an, die Verarbeitung weiterer Umschreibbedingungen zu stoppen, selbst bei einem nächsten Location-Match!

Zusammenfassung

Sie können jetzt URLs entweder mit der rewrite- oder der return-Direktive umschreiben. Die in diesem Tutorial verwendeten Beispiele für das Umschreiben sind einfach und leicht zu verstehen. Sie können nun damit beginnen, komplexere Umschreibregeln zu schreiben!

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: