nginx Konfigurationsort Zusammenfassungsort Regelmäßiges Schreiben und Umschreiben von Regeln

nginx Konfigurationsort Zusammenfassungsort Regelmäßiges Schreiben und Umschreiben von Regeln

1. Regulärer Ausdruck für den Standort

Schauen wir uns ein Beispiel an:

Standort = / {
 # Genaue Übereinstimmung / , auf den Hostnamen darf keine Zeichenfolge folgen [ Konfiguration A ]
}

Standort / {
 # Da alle Adressen mit / beginnen, wird diese Regel auf alle Anfragen zutreffen. # Aber reguläre Ausdrücke und längste Zeichenfolgen werden zuerst abgeglichen [Konfiguration B]
}

Standort /Dokumente/ {
 # Findet alle Adressen, die mit /documents/ beginnen. Nach dem Treffer wird die Suche fortgesetzt. # Dieser wird nur verwendet, wenn die folgenden regulären Ausdrücke nicht übereinstimmen [Konfiguration C]
}

Ort ~ /documents/Abc {
 # Findet Übereinstimmungen mit allen Adressen, die mit /documents/Abc beginnen. Wenn die Übereinstimmung gefunden wurde, suchen Sie weiter unten. # Dieser wird nur verwendet, wenn der folgende reguläre Ausdruck nicht mit [configuration CC] übereinstimmt.
}

Standort ^~ /images/ {
 # 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.
 [ Konfiguration D ]
}

Standort ~* \.(gif|jpg|jpeg)$ {
 # Stimmt mit allen Anfragen überein, die mit gif, jpg oder jpeg enden. # Allerdings werden alle Anfragen für Bilder unter /images/ von Konfiguration D verarbeitet, weil ^~ diesen regulären Ausdruck nicht erreichen kann [Konfiguration E].
}

Standort /Bilder/ {
 # Das Zeichen entspricht /images/. Wenn Sie weiter nach unten schauen, werden Sie feststellen, dass ^~ existiert [ Konfiguration F ]
}

Standort /images/abc {
 # Das längste Zeichen entspricht /images/abc. Wenn Sie weiter nach unten schauen, werden Sie feststellen, dass ^~ vorhanden ist. # Die Reihenfolge der Platzierung von F und G ist irrelevant [Konfiguration G]
}

Standort ~ /images/abc/ {
 # Erst wenn Konfiguration D entfernt wird, wird es wirksam: Suchen Sie zuerst nach einer Übereinstimmung mit der Adresse, die mit Konfiguration G beginnt, setzen Sie die Suche fort und verwenden Sie [Konfiguration H], wenn dieser reguläre Ausdruck übereinstimmt.
}

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

Standortpräfix

Kein Präfix stimmt mit Standorten überein, die mit dem angegebenen Muster beginnen

= Genaue Übereinstimmung, beginnt nicht mit dem angegebenen Muster

~ Regulärer Ausdrucksabgleich, Groß-/Kleinschreibung beachten

~* Übereinstimmung mit regulären Ausdrücken, ohne Berücksichtigung der Groß-/Kleinschreibung

^~ Nicht reguläre Übereinstimmung, Übereinstimmung mit Orten, die mit dem angegebenen Muster beginnen
/ Universelle Übereinstimmung, wenn es keine andere Übereinstimmung gibt, wird jede Anfrage übereinstimmen

Standortabgleichsreihenfolge

Mehrere reguläre Standorte werden direkt in der Reihenfolge abgeglichen, in der sie geschrieben werden. Sobald eine Übereinstimmung erfolgreich ist, wird keine weitere Übereinstimmung durchgeführt.

Gewöhnliche (nicht reguläre) Standorte werden weiter nach unten verschoben, bis die höchste Übereinstimmung (maximale Präfixübereinstimmung) gefunden wird.

Wenn sowohl der gemeinsame Standort als auch der reguläre Standort vorhanden sind und der reguläre Standort erfolgreich abgeglichen wurde, wird der gemeinsame Standort nicht erneut abgeglichen.

Wenn alle Standorttypen vorhanden sind, "="-Übereinstimmung > "^~"-Übereinstimmung > reguläre Übereinstimmung > normal (maximale Präfixübereinstimmung)

Befehl:

(Standort =) > (Standort vollständiger Pfad) > (Standort ^~ Pfad) > (Standort ~,~* reguläre Sequenz) > (Standort teilweiser Startpfad) > (/)

Die oben aufgeführten Übereinstimmungsergebnisse

Gemäß der obigen Standortbeschreibung ergeben sich folgende Übereinstimmungsbeispiele:

/ -> config A

Genaue Übereinstimmung, selbst /index.html wird nicht übereinstimmen.

/downloads/download.html -> Konfiguration B

Nach dem Abgleichen von B gibt es unten keine Übereinstimmung. Verwenden Sie daher B

/images/1.gif -> Konfiguration D

Passt zu F, passt zu D, hört auf, nach unten zu gehen

/images/abc/def -> Konfiguration D

Die längste Übereinstimmung ist G, sie geht nach unten bis zur Übereinstimmung D und endet dort. Sie können sehen, dass alles, was mit /images/ beginnt, mit D übereinstimmt und endet. Es ergibt keinen Sinn, hier FG zu schreiben, und H wird nie an die Reihe kommen. Dies dient nur zur Veranschaulichung der Übereinstimmungsreihenfolge.

/documents/document.html -> Konfiguration 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.

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/
}

2. Regeln neu schreiben

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 das Umschreiben und Umleiten von URLs zu erreichen. rewrite kann nur in server{}, location{}, if{} platziert werden und kann nur auf die Zeichenfolge nach dem Domänennamen angewendet werden, mit Ausnahme der übergebenen Parameter

Beispielsweise wird mit http://jb51.net/a/we/index.php?id=1&u=str nur /a/we/index.php umgeschrieben.

Syntaxrewrite rewrite regex replacement [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.

Es zeigt, dass sich Rewrite- und Location-Funktionen ähneln und beide Sprünge ausführen können. Der Hauptunterschied besteht darin, dass Rewrite den Pfad ändert, um Ressourcen innerhalb desselben Domänennamens abzurufen, während Location den Zugriff auf eine Klasse von Pfaden steuert oder einen Reverse-Proxy ausführt, der Proxy-Pass an andere Maschinen ausführen kann.

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

Führen Sie die Umschreibeanweisung des Serverblocks aus

Durchführen eines Standortabgleichs

Führen Sie die Umschreibeanweisung 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.

2.1 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:

„Last“ wird normalerweise in „Server“ und „if“ geschrieben, während „Break“ normalerweise in „Location“ verwendet wird.
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.
Sowohl „Break“ als auch „Last“ können die Ausführung nachfolgender Umschreibanweisungen verhindern.

2.2 if-Anweisung und globale Variablen

wenn Urteilsanweisung

Die Syntax lautet if(condition){...} und beurteilt die gegebene Bedingung. 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 !=

~ Übereinstimmung mit regulären Ausdrücken, ~* Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung, !~ Nichtübereinstimmung mit Berücksichtigung der Groß-/Kleinschreibung

-f und !-f wird ermittelt, ob eine Datei existiert

-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

Zum Beispiel:

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.com, www.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

2.3 Allgemeine reguläre Ausdrücke

. : 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
$: Einführung in passende Zeichenfolgen
{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.

2.4 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.

Das Obige ist eine Zusammenfassung der Regularisierung des Nginx-Konfigurationsorts und des Schreibens von Umschreibregeln. In den folgenden verwandten Artikeln finden Sie weitere Artikel zur Einführung in die Nginx-Konfiguration. Ich hoffe, es kann Ihnen helfen.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung der Standort- und Umschreibenutzung in nginx
  • Detaillierte Erläuterung des Nginx-Umschreibens und der Lokalisierung gemäß URL-Parametern
  • Detaillierte Erläuterung der Zusammenfassung des Nginx-Konfigurationsorts und des Schreibens von Umschreibregeln
  • Detaillierte Erläuterung der Standortübereinstimmung und der Umleitung in Nginx

<<:  Eine kurze Diskussion zum Problem von Daten mit Nullwerten in der MySQL-Datenbank

>>:  Wartungsmethode für den Innodb-Systemtabellenbereich

Artikel empfehlen

Detaillierte Erklärung der Mencached-Cache-Konfiguration basierend auf Nginx

Einführung Memcached ist ein verteiltes Caching-S...

Docker-Lernen: Die spezifische Verwendung von Container-Containern

Container sind ein weiteres Kernkonzept von Docke...

Beispielcode zum Konvertieren von HTML-Tabellendaten in das JSON-Format

Die Javascript-Funktion zum Konvertieren von <t...

Mehrere Möglichkeiten zum Sichern einer MySql-Datenbank

mysqldump-Tool-Sicherung Sichern Sie die gesamte ...

TypeScript-Dekorator-Definition

Inhaltsverzeichnis 1. Konzept 1.1 Definition 1.2 ...

Detaillierte Erläuterung der MySQL-Multitabellen-Joinabfrage

Inhaltsverzeichnis Abfrage zum Verbinden mehrerer...

Mehrere Implementierungsmethoden der Tab-Leiste (empfohlen)

Registerkarten: Kategorie + Beschreibung Tag-Leis...

Detaillierte Erläuterung der Nginx-Timeout-Konfiguration

Ich habe kürzlich in einem Projekt nginx und im B...

So setzen Sie das MySQL-Root-Passwort zurück

Inhaltsverzeichnis 1. Ich habe das Root-Passwort ...

Welche Regeln gelten für den Kontext in JavaScript-Funktionen?

Inhaltsverzeichnis 1. Regel 1: Objekt.Methode() 1...

uni-app implementiert NFC-Lesefunktion

In diesem Artikel wird der spezifische Code der U...