Detaillierte Erklärung des Rewrite-Moduls von Nginx

Detaillierte Erklärung des Rewrite-Moduls von Nginx

Das Umschreibmodul ist das Modul ngx_http_rewrite_module. Seine Hauptfunktion besteht darin, die Anforderungs-URI umzuschreiben. Es ist das standardmäßig in Nginx installierte Modul. Das Umschreibmodul schreibt die URI entsprechend dem PCRE-regulären Ausdruck um, initiiert dann eine interne Umleitung und gleicht den Standort ab oder führt direkt eine 30-fache Umleitung durch, um zum Client zurückzukehren.

Die Reihenfolge der Befehlsausführung besteht darin, zuerst die Befehle zum Umschreiben des Moduls im Serverblock auszuführen, um nach dem Umschreiben die Anforderungs-URI zu erhalten.
Führen Sie dann die folgenden Anweisungen in einer Schleife aus

Wenn das Flag „Break Loop“ nicht gefunden wird, wird diese Schleife höchstens 10 Mal ausgeführt. Wir können jedoch die Anweisung „Break“ verwenden, um die neue Schleifenrunde nach dem Umschreiben zu unterbrechen.
(1). Passen Sie den definierten Standortblock nach dem Umschreiben an die Anforderungs-URI an

(2) Führen Sie die Anweisungen zum Umschreiben des Moduls nacheinander an der entsprechenden Stelle aus

Anweisung
brechen
Kontext: Server, Standort, wenn
Stoppen Sie die Ausführung des Befehlssatzes von ngx_http_rewrite_module, andere Modulbefehle sind jedoch nicht betroffen

Beispiel

Server {
 hören Sie 8080;
 # Hier stoppt break die Ausführung der Return-Anweisung des Serverblocks (die Return-Anweisung gehört zum Rewrite-Modul)
 # Wenn Sie es auskommentieren, werden alle eingehenden Anfragen ok zurückgegeben
 brechen;
 gebe 200 "ok" zurück;
 Standort = /testbreak {
  brechen;
  gib 200 $request_uri zurück;
  Proxy-Passwort http://127.0.0.1:8080/anderes;
 }
 Standort / {
  gib 200 $request_uri zurück;
 }
}

# Senden Sie die Anfrage wie folgt# curl 127.0.0.1:8080/testbreak
# /andere

# Sie können sehen, dass `/other` anstelle von `/testbreak` zurückgegeben wird, was darauf hinweist, dass die Anweisung `proxy_pass` noch ausgeführt wird. # Das heißt, die Anweisungen anderer Module werden nicht durch break unterbrochen. # (proxy_pass ist die Anweisung von ngx_http_proxy_module)

Wenn
Kontext: Server, Standort

Bestimmt, ob der Inhalt der if-Blockanweisung basierend auf den angegebenen Bedingungen ausgeführt werden soll

Mehrere Urteilsbedingungen in if
1. Ein Variablenname. Wenn der Wert der Variable $variable eine leere Zeichenfolge oder die Zeichenfolge "0" ist, ist sie falsch
2. Der Vergleich zwischen einer Variablen und einem String ist gleich (=) und ungleich (!=). Beachten Sie, dass Sie Gleichheit hier nicht als Zuweisungsanweisung verwenden sollten.
3. Der Mustervergleichsoperator für eine Variable und einen regulären Ausdruck kann sein: (~ für regulären Vergleich mit Groß- und Kleinschreibung, ~ für regulären Vergleich ohne Groß- und Kleinschreibung, !! , die Negation der ersten beiden)
4. Überprüfen Sie, ob die Datei existiert, indem Sie -f (existiert) und !-f (existiert nicht) verwenden.
5. Überprüfen Sie, ob der Pfad existiert, indem Sie -d (existiert) und !-d (existiert nicht) verwenden. Das folgende Urteil kann eine Zeichenfolge oder eine Variable sein
6. Überprüfen Sie, ob eine Datei, ein Pfad oder ein Link existiert, indem Sie -e (existiert) und !-e (existiert nicht) verwenden. Die folgende Überprüfung kann eine Zeichenfolge oder eine Variable sein.
7. Um zu prüfen, ob eine Datei eine ausführbare Datei ist, verwenden Sie -x (ausführbar) und !-x (nicht ausführbar). Das folgende Urteil kann eine Zeichenfolge oder eine Variable sein.

Beachten Sie, dass die Werte in den obigen Punkten 1, 2 und 3 Variablen sein müssen, während die Werte in den Punkten 4, 5, 6 und 7 entweder Variablen oder Zeichenfolgen sein können. Die grundlegende Verwendung von -f/-d/-e/-x ist dieselbe wie bei bash.

setze $variable "0"; 
wenn ($variable) {
 # Wird nicht ausgeführt, da „0“ falsch ist
 brechen;   
}

# Es ist kein Problem, Variablen zum Abgleichen von regulären Ausdrücken zu verwenden, wenn ( $http_host ~ "^star\.igrow\.cn$" ) {
 brechen;   
}

# String entspricht regulärem Ausdruck und meldet einen Fehler, wenn ( "star" ~ "^star\.igrow\.cn$" ) {
 brechen;   
}
# Überprüfen Sie, ob sowohl dateiähnliche Zeichenfolgen als auch Variablen in Ordnung sind, if ( !-f "/data.log" ) {
 brechen;   
}

wenn ( !-f $dateiname ) {
 brechen;   
}

zurückkehren

Kontext: Server, Standort, wenn
Rückgabecode [Text];
Rückgabecode-URL;
Rücksprung-URL;

Stoppt die Verarbeitung und gibt den angegebenen Code an den Client zurück. Der nicht standardmäßige Code 444 schließt die Verbindung, ohne einen Antwortheader zu senden.

Ab Version 0.8.42 kann die Return-Anweisung eine Umleitungs-URL angeben (der Statuscode kann 301, 302, 303, 307 sein).
Auch bei anderen Statuscodes lässt sich der Textinhalt der Antwort festlegen, zudem können die Weiterleitungs-URL und der Antworttext Variablen enthalten.

Es gibt einen Sonderfall, in dem die umgeleitete URL als lokale URL dieses Servers angegeben werden kann. In diesem Fall generiert nginx automatisch eine vollständige URL basierend auf dem angeforderten Protokoll $scheme, Servername in Umleitung und Port in Umleitung (hierbei ist zu beachten, dass die Anweisungen Servername in Umleitung und Port in Umleitung angeben, ob der Servername und der Abhörport im Serverblock als Umleitungen verwendet werden sollen).

# Rückkehrcode [Text]; Rückkehr ok zum Client-Standort = /ok {
 gebe 200 "ok" zurück;
}

# Rückgabecode URL; Temporäre Weiterleitung zum Baidu-Standort = /redirect {
 Rückgabe 302 http://www.baidu.com;
}

# return URL; Wie oben ist auch hier der Standardwert eine temporäre Umleitungsadresse = /redirect {
 zurück zu http://www.baidu.com;
}

umschreiben

Kontext: Server, Standort, wenn


Regex-Ersetzung neu schreiben [Flag];

Die Rewrite-Direktive verwendet den angegebenen regulären Ausdruck (regex), um die angeforderte URI abzugleichen. Wenn die Übereinstimmung erfolgreich ist, wird die URI durch Ersetzung geändert. Umschreibeanweisungen werden in der Reihenfolge ausgeführt, in der sie in der Konfigurationsdatei erscheinen. Mit dem Flag kann die weitere Abarbeitung der Anweisung abgebrochen werden. Wenn die Ersetzungszeichenfolge mit http://, https:// oder $scheme beginnt, beenden Sie die Verarbeitung nachfolgender Inhalte und leiten Sie sie direkt zurück zum Client um.

Im ersten Fall wird der String mit http:// umgeschrieben.

Standort / {
 # Bei Übereinstimmung mit dem regulären Ausdruck /test1/(.*) wird die Anfrage vorübergehend auf http://www.$1.com umgeleitet
 # Entspricht einer als Umleitung geschriebenen Flagge
 schreibe /test1/(.*) http://www.$1.com neu;
 gebe 200 "ok" zurück;
}
# Geben Sie 127.0.0.1:8080/test1/baidu im Browser ein 
# Vorübergehende Weiterleitung zu www.baidu.com
# Der folgende Return-Befehl kann nicht ausgeführt werden

Im zweiten Fall wird der String ohne http:// umgeschrieben.

Standort / {
 schreibe /test1/(.*) www.$1.com neu;
 gebe 200 "ok" zurück;
}
# Senden Sie die Anfrage wie folgt# curl 127.0.0.1:8080/test1/baidu
# OK

# Hier gibt es kein http://, es handelt sich also nur um eine einfache Umschreibung. Die angeforderte URI wird von /test1/baidu in www.baidu.com umgeschrieben
# Da der Umschreibbefehl sequenziell ausgeführt wird, besteht der nächste Schritt darin, den Rückgabebefehl auszuführen und die Antwort ist in Ordnung

Vier Flaggen des Umschreibens

1.letzte
Stoppen Sie die Verarbeitung des aktuellen Anweisungssatzes für ngx_http_rewrite_module und beginnen Sie mit der Suche nach einem Speicherort, der mit der geänderten URI übereinstimmt. (Da „letzter“ „Fortfahren“ bedeutet, wird weiterhin versucht, Übereinstimmungen zu finden und zu anderen Speicherorten zu springen.)
2. Pause
Stoppt die Verarbeitung des aktuellen Satzes von ngx_http_rewrite_module-Anweisungen, genau wie die oben erwähnte Break-Anweisung; (Break bedeutet „Break-Stopp“)
3. Weiterleitung
Gibt eine temporäre 302-Weiterleitung zurück. (Es kann als "vorübergehende Vermietung" verstanden werden)
4.dauerhaft
Gibt eine permanente 301-Weiterleitung zurück. (Es kann als „Umzug in ein neues Zuhause“ verstanden werden)

# Wenn es kein Umschreiben und kein Flag danach gibt, wird es sequenziell ausgeführt. # Wenn es an der Position keine Umschreibmodulanweisung gibt, die ausgeführt werden kann, wird es umgeschrieben, um eine neue Runde der Positionsübereinstimmung mit der Position / { einzuleiten.
 # Ohne Flag ist die Standardreihenfolge „rewrite ^/test1 /test2“;
 rewrite ^/test2 /test3; # Eine neue Runde von Location-Matching-URIs wird hier eingeleitet, nämlich /test3
}

Standort = /test2 {
 returniere 200 "/test2";
} 

Standort = /test3 {
 returniere 200 "/test3";
}
# Senden Sie die folgende Anfrage# curl 127.0.0.1:8080/test1
# /test3

Der Unterschied zwischen Last und Break

Wie „last“ und „break“ beenden sie die Ausführung anderer Anweisungen zum Umschreiben von Modulen an dieser Stelle.
Aber „last“ leitet sofort eine neue Runde der Standortübereinstimmung ein, während „break“ dies nicht tut.


Standort / {
 neu schreiben ^/test1 /test2;
 rewrite ^/test2 /test3 last; # Eine neue Runde von Location-Matching-URIs wird hier eingeleitet: /test3
 neu schreiben ^/test3 /test4;
 Proxy-Passwort http://www.baidu.com;
}

Standort = /test2 {
 returniere 200 "/test2";
} 

Standort = /test3 {
 returniere 200 "/test3";
}
Standort = /test4 {
 returniere 200 "/test4";
}
# Senden Sie die folgende Anfrage# curl 127.0.0.1:8080/test1
# /test3 

Wenn Sie den obigen Codeort / in den folgenden Codeort / { ändern,
 neu schreiben ^/test1 /test2;
 # Eine neue Runde des Standortabgleichs wird hier nicht eingeleitet; die nachfolgenden Anweisungen zum Umschreiben des Moduls werden beendet und die umgeschriebene URI lautet /more/index.html.
 neu schreiben ^/test2 /more/index.html break; 
 rewrite /more/index\.html /test4; # Dieser Befehl wird ignoriert. # Da proxy_pass kein Befehl des Rewrite-Moduls ist, wird er nicht durch break proxy_pass https://www.baidu.com; beendet.
}
# Senden Sie die folgende Anfrage# Geben Sie 127.0.0.1:8080/test1 in den Browser ein 
# Agent zur Baidu-Produktseite https://www.baidu.com/more/index.html;

Anforderungsparameter nach dem Umschreiben <br /> Wenn die Ersetzungszeichenfolge replacement neue Anforderungsparameter enthält, werden die vorherigen Anforderungsparameter dahinter angehängt. Wenn Sie die vorherigen Parameter nicht möchten, setzen Sie am Ende der Ersetzungszeichenfolge ein Fragezeichen, um das Anhängen zu vermeiden.

# Da am Ende ein ? hinzugefügt wird, werden die ursprünglichen Anforderungsparameter nach dem Umschreiben nicht an die URL angehängt. rewrite ^/users/(.*)$ /show?user=$1? last;

Protokoll neu schreiben

Kontext: http, Server, Standort, wenn

Aktivieren oder deaktivieren Sie das Protokoll der Ausführung von Rewrite-Modulanweisungen. Wenn aktiviert, zeichnet Rewrite Protokolle auf Benachrichtigungsebene im Nginx-Fehlerprotokoll auf. Die Standardeinstellung ist deaktiviert.

Syntax: rewrite_log on | off;

Satz

Kontext: Server, Standort, wenn

Legt den Wert der angegebenen Variable fest. Der Wert einer Variablen kann Text, Variablen oder eine Kombination davon enthalten.

Standort / {
 setze $var1 "Host ist";
 setze $var2 $host;
 setze $var3 "uri ist $request_uri";
 return 200 „Antwort ok $var1$var2$var3“;
}
# Senden Sie die folgende Anfrage# curl 127.0.0.1:8080/test
# Antwort ok, Host ist 127.0.0.1, URI ist /test

nicht initialisierte_variable_warn

Kontext: http, Server, Standort, wenn

Steuert, ob Warnungen zu nicht initialisierten Variablen protokolliert werden. Standardmäßig aktiviert

Interne Umsetzung

Die Moduldirektiven ngx_http_rewrite_module werden während der Konfigurationsphase in interne Direktiven kompiliert, die während der Anforderungsverarbeitung interpretiert werden. Der Interpreter ist eine einfache virtuelle Stack-Maschine.

Beispielsweise die Anweisung

Standort /download/ { wenn (verboten) return 403; wenn (verboten) { return 403; } wenn (verboten) return403; wenn (langsam) { limit_rate 10k; } umschreiben ^/(download/. )/media/(. )…*$ /$1/mp3/$2.mp3 break; }

Wird in folgende Anleitung übersetzt:

Variable $forbidden auf Null prüfen gibt 403 zurück Codeende Variable $slow auf Null prüfen Übereinstimmung mit regulärem Ausdruck kopieren „/“ kopieren $1 kopieren „/mp3/“ kopieren $2 kopieren „.mp3“ Ende des regulären Ausdrucks Codeende

Beachten Sie, dass oben keine Limit_Rate-Direktive vorhanden ist, da sie nichts mit dem Modul ngx_http_rewrite_module zu tun hat. Erstellen Sie eine separate Konfiguration für den if-Block. Wenn die Bedingung erfüllt ist, wird für diese Konfiguration eine Anforderung mit einer Limitrate von 10.000 zugewiesen. \

Anweisung

umschreiben ^/(herunterladen/. )/medien/(. )…*$ /$1/mp3/$2.mp3 break;

Wenn der erste Schrägstrich im regulären Ausdruck in Klammern gesetzt wird, kann er vereinfacht werden:

umschreiben ^(/download/. )/media/(. )…*$ $1/mp3/$2.mp3 break;

Die entsprechende Anweisung würde folgendermaßen aussehen:

Übereinstimmung mit regulärem Ausdruck Kopiere $1 Kopiere „/mp3/“ Kopiere $2 Kopiere „.mp3“ Ende des regulären Ausdrucks Ende des Codes

Standort (nicht umschreibbares Modul)

Grammatik

Verwenden Sie es im Serverblock, beispielsweise:

  • Server{
  • Standortausdruck {
  • }

Standortausdruckstyp

Wenn Sie einen Pfad direkt schreiben, wird der Pfad mit einem regulären Ausdruck abgeglichen, wobei die Groß-/Kleinschreibung beachtet wird.
~* bedeutet, dass ein regulärer Abgleich durchgeführt wird, bei dem die Groß-/Kleinschreibung nicht beachtet wird.
^~ bedeutet normale Zeichenübereinstimmung. Verwenden Sie Präfixübereinstimmung. Wenn die Übereinstimmung erfolgreich ist, wird keine Übereinstimmung mit anderen Standorten hergestellt.
= Führt eine exakte Übereinstimmung gemeinsamer Zeichen durch. Das heißt, eine exakte Übereinstimmung.

Priorität
1. Der Gleichheitszeichentyp (=) hat die höchste Priorität. Sobald eine Übereinstimmung gefunden wurde, wird nicht nach weiteren Übereinstimmungen gesucht.
2.^~ Typausdruck. Sobald eine Übereinstimmung gefunden wurde, wird nicht nach weiteren Übereinstimmungen gesucht.
3. Der reguläre Ausdruckstyp (~ ~*) hat die nächsthöhere Priorität. Wenn mehrere Standorte vorhanden sind, die dem regulären Ausdruck entsprechen, wird der Standort mit dem längsten regulären Ausdruck verwendet.
4. Herkömmlicher String-Matching-Typ. Übereinstimmung nach Präfix.

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung des Umschreibmoduls von Nginx. Weitere relevante Inhalte zum Umschreiben von Nginx finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Prinzip und Anwendungsbeispiele des URL-Umschreibmechanismus von Nginx
  • Beispiel für die reguläre Umschreibmethode für Nginx Rewrite (Matching)
  • Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx
  • So leiten Sie eine URL mit Nginx Rewrite um
  • Detaillierte Erläuterung des Nginx-Umschreibens und der Lokalisierung gemäß URL-Parametern
  • Nginx umschreiben, Grundlagen umschreiben und Beispiele teilen
  • Einführung in die Nginx-Rewrite-Regeln und -Verwendung sowie Fertigkeitsbeispiele
  • Nginx: Pseudostatische Konfigurationsparameter und Anwendungsbeispiele neu schreiben
  • Analyse der Nutzungsszenarien für die Nginx-Umschreibfunktion

<<:  css Alle Elemente ab dem n-ten abrufen

>>:  Vue-Formulareingabebindung V-Modell

Artikel empfehlen

Nginx-Zugriffssteuerungs- und Parameteroptimierungsmethoden

Globale Nginx-Variablen Es gibt viele globale Var...

So schreiben Sie den Einführungsinhalt der Infoseite der Website

Alle Websites, ob offiziell, E-Commerce, soziale ...

Grafisches Tutorial zur Installation von MySQL5.7.18 im Windows-System

MySQL-Installationstutorial für Windows-Systeme h...

Schritte zum Exportieren der Felder und zugehörigen Attribute von MySQL-Tabellen

Müssen die Felder und Eigenschaften der Tabelle i...

HTML-Tags: Sub-Tag und Sup-Tag

Heute stelle ich zwei HTML-Tags vor, die ich nich...

So verwenden Sie den Linux-Befehl tr

01. Befehlsübersicht Der Befehl tr kann Zeichen a...

Detaillierte Erläuterung der MySQL 8.0-Richtlinie zum Ablauf von Passwörtern

Ab MySQL 8.0.16 können Sie eine Richtlinie zum Ab...

Beispiel für utf8mb4-Sortierung in MySQL

Allgemeine utf8mb4-Sortierregeln in MySQL sind: u...

Zusammenfassung der XHTML-Tags auf Blockebene

* Adresse - Adresse * Blockzitat - Blockzitat * Mi...