Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx

Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx

1. Zusammenfassung der Standortnutzung

Der Standort kann unterschiedliche Anfragetypen unterschiedlichen Verarbeitungsmethoden zuordnen.

1. Standortnutzung

Speicherort ~* /js/.*/\.js

  • Der Beginn mit = weist auf eine genaue Übereinstimmung hin; beispielsweise werden nur Anforderungen abgeglichen, die mit dem Stammverzeichnis enden, und es kann keine Zeichenfolge verfolgt werden.
  • Beginnt mit ^~, bedeutet dies, dass die URI mit einer regulären Zeichenfolge beginnt, nicht mit einer regulären Übereinstimmung.
  • Der Beginn mit ~ weist auf eine reguläre Übereinstimmung unter Beachtung der Groß- und Kleinschreibung hin.
  • Der Beginn mit ~* weist auf eine Übereinstimmung mit einem regulären Ausdruck ohne Berücksichtigung der Groß-/Kleinschreibung hin.
  • Beginnt mit /, universelle Übereinstimmung, wenn es keine andere Übereinstimmung gibt, wird jede Anfrage übereinstimmen

Die Reihenfolge der Standortübereinstimmung ist „Zuerst Übereinstimmung mit regulärem Wert, dann Übereinstimmung mit allgemeinem Wert“.

Korrektur: Die Reihenfolge der Standortübereinstimmung ist eigentlich „zuerst allgemeine Übereinstimmung, dann reguläre Übereinstimmung“. Wenn ich das sage, wird mir sicherlich jeder widersprechen, denn das Prinzip „Zuerst das Gemeinsame abgleichen, dann das Normale abgleichen“ kann die praktische Erfahrung, an die jeder gewöhnt ist, nicht erklären: „Zuerst das Normale abgleichen, dann das Gemeinsame abgleichen“. Hier kann ich nur kurz erklären, dass der Grund für dieses Missverständnis darin liegt, dass der reguläre Abgleich Vorrang vor dem normalen Abgleich hat.

2. Beispiele für die Standortnutzung

Regulärer Ausdruck für den Standort:

1. # Genaue Übereinstimmung /, auf den Hostnamen kann keine Zeichenfolge folgen

Standort = / {
[ Konfiguration A ]
} 

2.# Alle Adressen beginnen mit /, daher entspricht diese Regel letztendlich der Standardanforderung

# Aber reguläre Ausdrücke und längste Zeichenfolgen stimmen mit location / { überein
[ Konfiguration B ]
}

Beispiel:

  Standort / { 
     Proxy-Passwort http://Serverpools;
    } 
#Diese Regel kann nur dann abgeglichen werden, wenn andere Regeln die Anforderungen nicht erfüllen. Sie wird als letzte abgeglichen, mit dem niedrigsten Übereinstimmungsgrad. Die oben implementierte Funktion lautet: Wenn die Website beispielsweise www.blog.com ist; wenn danach nichts eingegeben wird,
Wenn andere Regeln nicht übereinstimmen, wird die Anforderung schließlich an den Server im Lastausgleichspool übergeben.

3.# Findet alle Adressen, die mit /documents/ beginnen. Nach dem Abgleich wird die Suche fortgesetzt

# Dieser wird nur verwendet, wenn der folgende reguläre Ausdruck nicht mit dem Speicherort /documents/ { übereinstimmt.
[ Konfiguration C ]
}

Beispiel:

Standort /static/
    {
    umschreiben ^ http://www.abc.com;   
    }
#Die oben implementierte Funktion: Angenommen, der Domänenname der Website lautet www.blog.com. Dann wird die obige Funktion so konfiguriert, dass www.blog.com/static/ eingegeben wird, unabhängig davon, welche Seite nach „static“ kommt (die Seite existiert möglicherweise nicht).
Anschließend erfolgt ggf. ein Sprung zur Website www.abc.com.

4.# Findet alle Adressen, die mit /documents/ beginnen. Nach dem Abgleich wird die Suche fortgesetzt

# Diese Regel wird nur angewendet, wenn der folgende reguläre Ausdruck nicht zutrifft

Ort ~ /documents/Abc {
[ Konfiguration CC ]
}

5.# Findet Übereinstimmungen mit allen Adressen, die mit /images/ beginnen. Nachdem die Übereinstimmung gefunden wurde, beenden Sie die Suche nach regulären Ausdrücken und verwenden Sie diesen.

Standort ^~ /images/ {
[ Konfiguration D ]
}

6.# Alle Anfragen abgleichen, die mit gif, jpg oder jpeg enden

# Allerdings werden alle Anfragen für Bilder unter /images/ von Konfiguration D verarbeitet, da ^~ diesen regulären Ausdruck nicht erreichen kann

Standort ~* \.(gif|jpg|jpeg)$ {
[ Konfiguration E ]
}

Beispiel:

7. Das Zeichen # entspricht /images/. Wenn Sie weiter nach unten gehen, werden Sie feststellen, dass ^~ vorhanden ist.

Standort /Bilder/ {
[ Konfiguration F ]
}

8.# Das längste Zeichen entspricht /images/abc. Gehen Sie weiter nach unten und Sie werden feststellen, dass ^~ existiert

# Die Reihenfolge der Platzierung von F und G spielt keine Rolle

Standort /images/abc {
[ Konfiguration G ]
}

9.# Erst wenn Konfiguration D entfernt wird, wird es wirksam: Zuerst die Adresse abgleichen, die am längsten mit Konfiguration G beginnt, weiter nach unten suchen und diesen regulären Ausdruck abgleichen, verwenden

Standort ~ /images/abc/ {
[ Konfiguration H ]
}

Reihenfolge ohne Priorität:

(Standort =) > (Standort vollständiger Pfad) > (Standort ^~ Pfad) > (Standort ~,~* reguläre Sequenz) > (Standort teilweiser Startpfad) > (/) Die obigen Übereinstimmungsergebnisse:

Gemäß der obigen Standortbeschreibung ergeben sich folgende Übereinstimmungsbeispiele:
/ -> Konfiguration A
Genaue Übereinstimmung, auch /index.html kann nicht mit /downloads/download.html übereinstimmen -> Konfiguration B
Nach dem Abgleichen von B gibt es unten keine Übereinstimmung. Verwenden Sie daher B
/images/1.gif -> Konfiguration D
Stimmt mit F überein, stimmt mit D überein, stoppt bei /images/abc/def -> Konfiguration D
Die längste Übereinstimmung ist G, dann geht es runter zu D und hört auf. Sie können sehen, dass alles, was mit /images/ beginnt, mit D übereinstimmt und aufhört. FG ist hier bedeutungslos und H wird nie an die Reihe kommen. Dies dient nur zur Veranschaulichung der Übereinstimmungsreihenfolge /documents/document.html -> config C
Übereinstimmungen mit C, keine Übereinstimmungen unten, verwenden Sie C
/documents/1.jpg -> Konfiguration E
Stimmt mit C überein und dann mit E
/documents/Abc.jpg -> Konfiguration CC
Die längste Übereinstimmung ist C, und die reguläre Sequenz entspricht CC, nicht E.

3. Praktische Anwendungsvorschläge

Ich denke, dass es in der Praxis mindestens drei passende Regeldefinitionen gibt, und zwar die folgenden:

#Direkte Zuordnung zum Website-Stamm. Es ist häufiger, über den Domänennamen auf die Homepage der Website zuzugreifen. Dies beschleunigt die Verarbeitung, heißt es auf der offiziellen Website.
#Dies wird direkt an den Backend-Anwendungsserver weitergeleitet, oder es kann eine statische Homepage sein# Die erste erforderliche Regel location = / {
Proxy-Passwort http://tomcat:8080/index
}
# Die zweite obligatorische Regel besteht darin, statische Dateianforderungen zu verarbeiten. Dies ist die Stärke von nginx als HTTP-Server. # Es gibt zwei Konfigurationsmodi, Verzeichnisübereinstimmung oder Suffixübereinstimmung. Wählen Sie einen aus oder verwenden Sie beide Speicherorte ^~ /static/ {
Wurzel /webroot/static/;
}
Standort ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
Wurzel /webroot/res/;
}
#Die dritte Regel ist eine allgemeine Regel, die zum Weiterleiten dynamischer Anforderungen an den Back-End-Anwendungsserver verwendet wird. #Nicht statische Dateianforderungen sind standardmäßig dynamische Anforderungen, und Sie können sie entsprechend Ihrer tatsächlichen Situation erfassen. #Schließlich haben einige beliebte Frameworks mittlerweile selten die Suffixe .php und .jsp. location / {
Proxy-Passwort http://tomcat:8080/
}
http://tengine.taobao.org/book/chapter_02.html
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

2. Zusammenfassung der Rewrite-Nutzung

1. Definition von Umschreiben

Die Umschreibfunktion verwendet die von nginx bereitgestellten globalen Variablen oder die von Ihnen selbst festgelegten Variablen, kombiniert mit regulären Ausdrücken und Flags, um eine URL-Umschreibung und -Umleitung zu erreichen.

 Das Umschreiben kann nur in Server{}, Location{} und If{} erfolgen und kann nur mit der Zeichenfolge nach dem Domänennamen ohne Berücksichtigung der übergebenen Parameter erfolgen.
Beispielsweise wird mit http://seanlook.com/a/we/index.php?id=1&u=str nur /a/we/index.php umgeschrieben.

2. Syntax von rewirte

Regex-Ersetzung neu schreiben [Flag];

Wenn ein relativer Domänenname oder eine relative Parameterzeichenfolge funktioniert, können Sie die globale Variablenübereinstimmung verwenden oder den Reverse-Proxy „proxy_pass“ verwenden.

Aus dem Obigen ist ersichtlich, dass sich die Umschreib- und Lokalisierungsfunktionen einigermaßen ähneln und beide Sprünge erzielen können. Der Hauptunterschied besteht darin, dass beim Umschreiben der Pfad geändert wird, um Ressourcen innerhalb desselben Domänennamens abzurufen, während beim Standort der Zugriff gesteuert wird oder ein Reverse-Proxy für eine Pfadklasse ausgeführt wird, der per Proxy an andere Maschinen weitergegeben werden kann.

In vielen Fällen wird auch das Umschreiben an einem bestimmten Ort durchgeführt. Die Reihenfolge ihrer Ausführung ist:

1 Führen Sie die Umschreibeanweisung des Serverblocks aus

2. Standortabgleich durchführen

3 Führen Sie den Umschreibbefehl am ausgewählten Speicherort aus

Wenn die URI in einem beliebigen Schritt neu geschrieben wird, werden die Schritte 1 bis 3 in einer Schleife erneut ausgeführt, bis die echte Datei gefunden wird. Wenn die Schleife mehr als 10 Mal ausgeführt wird, wird ein interner Serverfehler 500 zurückgegeben.

Flagge

  • last : Entspricht dem Flag [L] von Apache und zeigt an, dass das Umschreiben abgeschlossen ist.
  • break: Stoppen Sie die Ausführung des nachfolgenden Umschreibbefehlssatzes des aktuellen virtuellen Hosts
  • Umleitung: Gibt eine temporäre Umleitung 302 zurück. In der Adressleiste wird die umgeleitete Adresse angezeigt.
  • permanent: Gibt eine permanente 301-Umleitung zurück und in der Adressleiste wird die umgeleitete Adresse angezeigt

Da 301 und 302 nicht einfach nur den Statuscode zurückgeben können, muss auch eine Umleitungs-URL vorhanden sein. Aus diesem Grund kann die Rückgabeanweisung nicht 301,302 zurückgeben. Der Unterschied zwischen last und break ist hier etwas schwierig zu verstehen:

  1. „Last“ wird normalerweise in „Server“ und „if“ geschrieben, während „Break“ normalerweise in „Location“ verwendet wird.
  2. last beendet den neu geschriebenen URL-Abgleich nicht, d. h. die neue URL durchläuft den Abgleichprozess vom Server aus erneut, während break den neu geschriebenen Abgleich beendet.
  3. Sowohl „Break“ als auch „Last“ können die Ausführung nachfolgender Umschreibanweisungen verhindern.

3. Schreiben Sie häufig verwendete reguläre Ausdrücke neu.

  • . : passt zu jedem Zeichen außer Newline
  • ? : 0 oder 1 Mal wiederholen
  • + : 1 oder mehr Mal wiederholen
  • *: 0 oder mehr Mal wiederholen
  • \d: entspricht einer Zahl
  • ^ : entspricht dem Anfang einer Zeichenfolge
  • $ : entspricht dem Ende der Zeichenfolge
  • {n} : n-mal wiederholen
  • {n,} : n-mal oder öfter wiederholen
  • [c]: Passt auf ein einzelnes Zeichen c
  • [az]: passt zu jedem Kleinbuchstaben az

Auf den zwischen den Klammern () stehenden Inhalt kann später durch $1 verwiesen werden, und $2 stellt den Inhalt im zweiten () dar. Was bei regulären Ausdrücken verwirrend ist, ist das \-Escape-Sonderzeichen.

Beispiel zum Umschreiben

Beispiel 1:
http {
# Definieren Sie das Bildprotokollformat log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
# Umschreibeprotokoll aktivieren rewrite_log on;
 
Server {
Wurzel /home/www;
 
Standort / {
# Informationen zur Neuschreibregel error_log logs/rewrite.log notice;
# Beachten Sie, dass hier einfache Anführungszeichen verwendet werden sollten, um {} zu vermeiden.
schreibe '^/images/([az]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 neu;
# Beachten Sie, dass Sie nach der obigen Regel nicht den Parameter „letzten“ hinzufügen können, da sonst der folgende Set-Befehl nicht ausgeführt wird: set $image_file $3;
Setze $image_type $4;
}
 
Standort /Daten {
#Geben Sie das Protokollformat für Bilder an, um den Bildtyp und die Bildgröße zu analysieren access_log logs/images.log mian;
Stammverzeichnis /Daten/Bilder;
# Wenden Sie die zuvor definierten Variablen an. Stellen Sie zuerst fest, ob die Datei vorhanden ist. Wenn nicht, stellen Sie dann fest, ob das Verzeichnis vorhanden ist. Wenn nicht, springen Sie zur letzten URL try_files /$arg_file /image404.html.
}
Standort = /image404.html {
# Wenn das Bild nicht existiert, geben Sie spezifische Informationen zurück. return 404 „Bild nicht gefunden\n“;
}
}
 
Bei einer Anfrage wie /images/ef/uh7b3/test.png wird sie in /data?file=test.png umgeschrieben, sodass sie mit dem Speicherort /data übereinstimmt. Überprüfen Sie zunächst, ob die Datei /data/images/test.png vorhanden ist. Wenn sie vorhanden ist, antworten Sie normal. Wenn nicht, schreiben Sie tryfiles an den neuen Speicherort image404 um und geben Sie direkt einen 404-Statuscode zurück.

Beispiel 2:
neu schreiben ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
Bei Dateianforderungen wie /images/bla_500x400.jpg werden diese an die Adresse /resizer/bla.jpg?width=500&height=400 umgeschrieben und es wird weiterhin versucht, den Speicherort abzugleichen.

if-Anweisung und globale Variablen

if-Urteilsanweisungssyntax

wenn (Bedingung)
{...}

Beurteilen Sie den gegebenen Zustand. Wenn wahr, werden die Umschreibeanweisungen in den geschweiften Klammern ausgeführt. Die if-Bedingung kann eine der folgenden sein:

Wenn der Ausdruck nur eine Variable ist und der Wert leer ist oder eine beliebige Zeichenfolge ist, die mit 0 beginnt, wird er als falsch betrachtet.
Wenn Sie Variablen und Inhalte direkt vergleichen, verwenden Sie = oder !=
~ Regulärer Ausdrucksabgleich
~* Groß-/Kleinschreibung wird nicht beachtet
!~ Groß-/Kleinschreibung nicht übereinstimmend
Mit -f und !-f wird ermittelt, ob eine Datei existiert
Mit -d und !-d wird ermittelt, ob ein Verzeichnis existiert
-e und !-e werden verwendet, um zu bestimmen, ob eine Datei oder ein Verzeichnis existiert
-x und !-x werden verwendet, um zu bestimmen, ob die Datei ausführbar ist

Beispiel:

Wenn das Benutzergerät ein IE-Browser ist, leiten Sie um, wenn ($http_user_agent ~ MSIE) {
umschreiben ^(.*)$ /msie/$1 break;
} //Wenn UA „MSIE“ enthält, schreiben Sie die Anfrage in das Verzeichnis /msid/ um, if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
setze $id $1;
} //Wenn das Cookie mit dem regulären Ausdruck übereinstimmt, setzen Sie die Variable $id so, dass sie dem Referenzteil des regulären Ausdrucks entspricht, if ($request_method = POST) {
Rückgabe 405;
} //Wenn die Übermittlungsmethode POST ist, ist der Rückgabestatus 405 (Methode nicht zulässig). Rückkehr kann nicht zurückkehren 301,302
 
wenn ($langsam) {
Grenzrate 10k;
} // Geschwindigkeitsbegrenzung, $slow kann mit dem Befehl set festgelegt werden if (!-f $request_filename){
brechen;
Proxy-Passwort http://127.0.0.1;
} //Wenn der angeforderte Dateiname nicht existiert, Reverse-Proxy zum lokalen Host. Der Break hier stoppt auch die Umschreibprüfung, wenn ($args ~ post=140){
umschreiben ^ http://example.com/ permanent;
} //Wenn die Abfragezeichenfolge „post=140“ enthält, permanente Weiterleitung zu example.com
 
Standort ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers, keine blockiert, www.jefflei.comwww.leizhenfang.com;
wenn ($ungültiger_Referrer) {
Rückgabe 404;
} //Anti-Hotlinking}

Globale Variablen

Die folgenden globalen Variablen können als Urteile verwendet werden

  • $args: #Diese Variable entspricht den Parametern in der Anforderungszeile, dasselbe wie $query_string
  • $content_length: Das Inhaltslängenfeld im Anforderungsheader.
  • $content_type: Das Content-Type-Feld im Anforderungsheader.
  • $document_root: Der in der Root-Direktive der aktuellen Anfrage angegebene Wert.
  • $host: Das Host-Headerfeld der Anforderung, andernfalls der Servername.
  • $http_user_agent: Client-Agent-Informationen
  • $http_cookie: Client-Cookie-Informationen
  • $limit_rate: Diese Variable kann die Verbindungsrate begrenzen.
  • $request_method: Die vom Client angeforderte Aktion, normalerweise GET oder POST.
  • $remote_addr: Die IP-Adresse des Clients.
  • $remote_port: Der Port des Clients.
  • $remote_user: Der Benutzername, der vom Auth Basic-Modul authentifiziert wurde.
  • $request_filename: Der Dateipfad der aktuellen Anfrage, generiert durch die Root- oder Alias-Direktive und die URI-Anfrage.
  • $scheme: HTTP-Methode (z. B. http, https).
  • $server_protocol: Das von der Anfrage verwendete Protokoll, normalerweise HTTP/1.0 oder HTTP/1.1.
  • $server_addr: Serveradresse. Dieser Wert kann nach Abschluss eines Systemaufrufs ermittelt werden.
  • $server_name: Servername.
  • $server_port: Die Portnummer, unter der die Anfrage beim Server eingeht.
  • $request_uri: Die ursprüngliche URI einschließlich der Anforderungsparameter, ohne den Hostnamen, z. B.: „/foo/bar.php?arg=baz“.
  • $uri: Die aktuelle URI ohne Anforderungsparameter. $uri enthält nicht den Hostnamen, z. B. „/foo/bar.html“.
  • $document_uri: Dasselbe wie $uri.

Beispiel:

http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri: http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename: /var/www/html/test1/test2/test.php

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des Rewrite-Moduls von Nginx
  • Prinzip und Anwendungsbeispiele des URL-Umschreibmechanismus von Nginx
  • Beispiel für die reguläre Umschreibmethode für Nginx Rewrite (Matching)
  • 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

<<:  Implementierung der Breakpoint-Wiederaufnahme in Node.js

>>:  Warum wird deine Like-Aussage nicht indexiert?

Artikel empfehlen

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.13

Installation der Msyql-Datenbank. Zu Ihrer Inform...

Mysql-Optimierung Zabbix-Partitionsoptimierung

Der größte Engpass bei der Verwendung von Zabbix ...

Detaillierte Erklärung der Zählung ohne Filterbedingungen in MySQL

zählen(*) erreichen 1. MyISAM: Speichert die Gesa...

Lösung für die Docker-Befehlsausnahme „Zugriff verweigert“

Installieren Sie Docker im Linux-System neu und g...

So implementieren Sie die Vervollständigung leerer Zellen in HTML-Tabellen

Als ich mir selbst die Webentwicklung beibrachte,...

So verwenden Sie den regulären Matching-Selektor für CSS-Attributwerte (Tipps)

Es gibt drei Typen von regulären Matching-Selekto...

Detaillierte Analyse des Reaktionsprinzips und der bidirektionalen Daten von Vue

Verstehen von object.defineProperty, um Reaktions...

Detaillierte Erklärung des MySQL-Überwachungstools mysql-monitor

1. Übersicht mysql-monitor MySQL-Überwachungstool...

Die Verbindung zwischen JavaScript-Konstruktoren und Prototypen

Inhaltsverzeichnis 1. Konstrukteure und Prototype...

Einführung in die neuen Funktionen von ECMAscript

Inhaltsverzeichnis 1. Standardwerte für Funktions...