Detaillierte Erläuterung der Umleitungskonfiguration und -praxis von Rewrite in Nginx

Detaillierte Erläuterung der Umleitungskonfiguration und -praxis von Rewrite in Nginx

1: Verstehen Sie die Bedeutung von Adressumschreibung und Adressweiterleitung.

Adressumschreibung und Adressweiterleitung sind zwei unterschiedliche Konzepte.

Durch das Umschreiben von Adressen wird eine Adressstandardisierung erreicht. Beispielsweise können wir www.baidu.com in die Adressleiste eingeben. Wir können auch www.baidu.cn eingeben. Am Ende wird es in www.baidu.com umgeschrieben. In der Adressleiste des Browsers wird auch www.baidu.com angezeigt.

Adressweiterleitung: Damit ist der Vorgang gemeint, bei dem nach dem Erreichen eines Datenpakets bei einer Netzwerkdatenübertragung an einem Router oder einer Bridge das Gerät die Paketadresse prüft und die Daten an das nächstgelegene lokale Netzwerk weiterleitet.

Daher gibt es zwischen der Adressumschreibung und der Adressweiterleitung die folgenden Unterschiede:

1. Durch das Umschreiben der Adresse wird die Adresse im Browser geändert und auf die neueste Adresse des Browsers umgeschrieben. Durch die Adressweiterleitung wird die Adresse des Browsers nicht geändert.
2. Das Umschreiben der Adresse generiert zwei Anfragen, während die Weiterleitung der Adresse nur eine Anfrage generiert.
3. Die Weiterleitung von Adressen erfolgt grundsätzlich innerhalb desselben Site-Projekts, während die Umschreibung von Adressen uneingeschränkt möglich ist.
4. Die Adressweiterleitung ist schneller als die Adressumleitung.

2: Die Verwendung von Rewrite-Anweisungen verstehen

Diese Anweisung wird verwendet, um die URI durch die Verwendung regulärer Ausdrücke zu ändern. Es können eine oder mehrere Anweisungen gleichzeitig existieren. Die URLs müssen der Reihe nach abgeglichen und verarbeitet werden.

Diese Direktive kann im Serverblock oder im Standortblock konfiguriert werden. Ihre grundlegende Syntaxstruktur ist wie folgt:

Regex-Ersetzung neu schreiben [Flag];

Die Bedeutung von „Umschreiben“: Diese Anweisung wird zum Umschreiben von URLs verwendet.
Die Bedeutung von Regex: Regulärer Ausdruck zum Abgleichen von URIs.
Ersetzung: Ersetzt den durch den regulären Ausdruck übereinstimmenden Inhalt durch Ersetzung.
Flagge: Flaggenmarke.

Das Flag hat die folgenden Werte:

  • letzte: Nachdem diese Regel abgeglichen wurde, fahren Sie mit der Abgleichung mit der neuen Standort-URI-Regel fort. (nicht allgemein gebräuchlich)
  • break: Diese Regel wird beendet, wenn sie erfüllt ist, und es werden keine weiteren Regeln erfüllt (wird nicht häufig verwendet).
  • Umleitung: Gibt eine temporäre 302-Umleitung zurück und die Browseradresse zeigt die neue URL-Adresse an.
  • permanent: gibt eine permanente 301-Weiterleitung zurück. Die Browseradresse zeigt die neue URL-Adresse an.

Zum Beispiel die folgenden Beispiele:

umschreiben ^/(.*) http://www.baidu.com/$1 permanent;

veranschaulichen:
„rewrite“ ist ein festes Schlüsselwort, was bedeutet, dass mit der Ausführung von Rewrite-Matching-Regeln begonnen wird.
Der reguläre Ausdruck ist ^/(.*). Dies ist ein regulärer Ausdruck, der mit dem vollständigen Domänennamen gefolgt von der Pfadadresse übereinstimmt.
Der Ersatz ist http://www.baidu.com/$1, wobei $1 der Inhalt des Regex-Teils () ist. Bei erfolgreicher Übereinstimmung die URL, zu der gesprungen werden soll.
Das Flag ist permanent, was eine permanente Umleitung bedeutet, d. h. einen Sprung zur Adresse http://www.baidu.com/$1.

Lassen Sie uns eine einfache Demo durchführen, um dies zu simulieren:

1. In unserem Testprojekt gibt es eine app.js. Der Code lautet wie folgt:

const Koa = erfordern('koa');
const app = new Koa();

const router = erfordern('koa-router')();

// Route hinzufügen router.get('/', ctx => {
 ctx.body = '<h1>Willkommen auf der Indexseite</h1>';
});

router.get('/home', ctx => {
 ctx.body = '<h1>Willkommen auf der Homepage</h1>';
});

router.get('/404', ctx => {
 ctx.body = '<h1>404…</h1>'
});

// Routing-Middleware laden app.use(router.routes());

app.listen(3001, () => { 
 console.log('Server läuft unter http://localhost:3001');
});

Führen Sie dann node app.js in der Befehlszeile aus, und dann können wir http://localhost:3001 im Browser aufrufen, um auf unsere entsprechende Seite zuzugreifen. Aber jetzt möchte ich das Node-Projekt auf meinem lokalen Nginx-Server bereitstellen. Bitte lesen Sie meinen Artikel zur Nginx-Installation. Dann möchte ich den Domänennamen verwenden, um auf unser Projekt zuzugreifen, also müssen wir ihn in unserer nginx.conf konfigurieren:

cd /usr/local/etc/nginx

Verwenden Sie dann den Befehl: sudo open /usr/local/etc/nginx/nginx.conf -a „sublime text“, um nginx.conf zu öffnen und es wie folgt zu konfigurieren:

Arbeiterprozesse 1;

Ereignisse {
  Arbeiterverbindungen 1024;
}
http {
  mime.types einschließen;
  Standardtyp Anwendung/Oktett-Stream;

  sendfile an;
  #tcp_nopush ein;

  #keepalive_timeout 0;
  KeepAlive-Timeout 65;

  #gzip ein;

  Server {
   hören Sie 8081;
   Servername localhost;
   Standort / {
    Stamm-HTML;
    Index Index.html Index.htm; 
   }
   Fehlerseite 500 502 503 504 /50x.html;
   Standort = /50x.html {
    Stamm-HTML;
   }
  }
  Server {
   hören Sie 8088;
   Servername xxx.abc.com;
   Standort / {
    Proxy-Passwort http://127.0.0.1:3001;
    umschreiben ^/(.*) http://www.baidu.com permanent;
   }
  }
}

Wie im obigen Code gezeigt, ist meine Abhörportnummer 8088 und die Servername-Konfiguration ist auf xxx.abc.com eingestellt. Wenn wir dann http://xxx.abc.com:8088/ besuchen, wird zuerst per Reverse-Proxy auf die Seite umgeleitet, die dem Knoten unter unserem http://127.0.0.1:3001 entspricht. Nachdem der Reverse-Proxy abgeschlossen ist, wird per Rewrite auf die Baidu-Seite umgeleitet. Nachdem die obige Konfiguration abgeschlossen ist, müssen wir den Nginx-Server neu starten. Verwenden Sie dazu den folgenden Befehl:

Wenn wir dann http://xxx.abc.com:8088/ im Browser aufrufen, wird die Ausführung wie in der folgenden Abbildung gezeigt durchgeführt. Zuerst wird http://xxx.abc.com:8088/ (301) dauerhaft umgeleitet, dann wird Baidu (307) aufgerufen, vorübergehend auf die Baidu-Seite umgeleitet und schließlich wird die Adresse der Baidu-Seite geladen; wie in der folgenden Demonstration gezeigt:

Aber wenn ich „permanent“ in „Umleitung“ ändere, beispielsweise nach der Nginx-Konfiguration: „rewrite ^/(.*) http://www.baidu.com redirect;“, wird es zu einer temporären 302-Umleitung. Wie unten dargestellt:

Drei: Die if-Anweisung verstehen

Diese Direktive wird verwendet, um bedingte Beurteilungen zu unterstützen und basierend auf den Ergebnissen der bedingten Beurteilung verschiedene Nginx-Konfigurationen auszuwählen. Wir können diese Direktive im Serverblock oder im Standortblock konfigurieren. Ihre grammatische Struktur ist:

if (Bedingung) {
 // ....
}

Bedingung ist ein Boolescher Wert mit der Bedeutung „Wahr“/„Falsch“.

Für die Rewrite-Direktive stehen die folgenden globalen Variablen zur Verfügung:

1. $args: Diese Variable speichert die Anforderungsanweisungen in der Anforderungs-URL. Beispielsweise in http://127.0.0.1:3001?arg1=value1&arg2=value2
„arg1=Wert1&arg2=Wert2“.
2. $content_length: Diese Variable speichert das Feld „Content-Length“ im Anforderungsheader.
3. $content_type: Diese Variable speichert das Feld „Content-Type“ im Anforderungsheader.
4. $document_root: Diese Variable speichert den Stammpfad für die aktuelle Anfrage.
5. $document_uri: Diese Variable speichert die aktuelle URI der Anfrage, enthält jedoch nicht die Anfrageanweisung. Beispiel: http://xxx.abc.com/home/1?arg1=value1&
"/home/1" in arg2=Wert2;
6. $host: Die Variable speichert den Host-Teil der angeforderten URL, beispielsweise xxx.abc.com in http://xxx.abc.com:8080/home.
7. $http_host: Der einzige Unterschied zwischen dieser Variable und $host besteht darin, dass sie die Portnummer enthält: oben ist beispielsweise xxx.abc.com:8080
8. $http_user_agent: Die Variable speichert die Proxy-Informationen des Clients.
9. $http_cookie, diese Variable speichert die Cookie-Informationen des Clients.
10. $remote_addr Diese Variable speichert die Adresse des Clients.
11. $remote_port Diese Variable speichert die Portnummer, die der Client verwendet, um eine Verbindung mit dem Server herzustellen.
12. Die Variable $remote_user speichert den Benutzernamen des Clients.
13. Die Variable $request_body_file speichert den Namen der lokalen Dateiressource, die an den Backend-Server gesendet wird
14. Die Variable $request_method speichert die Anforderungsmethode des Clients, z. B. „GET“, „POST“ usw.
15. Die Variable $request_filename speichert den Pfadnamen der aktuell angeforderten Ressourcendatei.
16. Die Variable $request_uri speichert die URI der aktuellen Anfrage und enthält die Anfrageanweisungen.
17. $query_string hat die gleiche Bedeutung wie die Variable $args.
18. Die Variable $scheme speichert das von der Client-Anforderung verwendete Protokoll, z. B. „http“, „https“ usw.
19. Die Variable $server_protocol speichert die Version des Client-Anforderungsprotokolls, z. B. „HTTP/1.0“, „HTTP/1.1“ usw.
..... usw

Die grundlegende Syntax eines regulären Ausdrucks lautet:

1. Variablen abgleichen

„~“ bedeutet, dass beim Abgleich zwischen Groß- und Kleinschreibung unterschieden wird.
„~*“ bedeutet, dass beim Abgleichprozess die Groß-/Kleinschreibung nicht beachtet wird.
'!~' Wenn die '~'-Übereinstimmung fehlschlägt, ist die Bedingung erfüllt.
'!~*' Wenn die '~*'-Übereinstimmung fehlschlägt, ist die Bedingung erfüllt.

Zum Beispiel:

wenn ($http_user_agent ~ MSIE) {
 // Bedeutung des Codes: ob der Wert $http_user_agent den MSIE-String enthält, wenn ja, ist er true, andernfalls false
}

2. Stellen Sie fest, ob die angeforderte Datei vorhanden ist

„-f“ Diese Bedingung ist erfüllt, wenn die angeforderte Datei existiert.
„!-f“ Gibt „true“ zurück, wenn das Verzeichnis für die Datei existiert, die Datei jedoch nicht. Wenn weder die Datei noch das Verzeichnis existieren, ist dies falsch.
Wenn das angeforderte Verzeichnis nicht existiert, die angeforderte Datei jedoch vorhanden ist, ist dies ebenfalls falsch.

if (-f $Anforderungsdateiname) {
 //Überprüfen, ob die angeforderte Datei existiert}

wenn (!-f $request_filename) {
 //Überprüfen, ob die angeforderte Datei nicht existiert}

3. Überprüfen Sie mit '-d' und '!-d', ob das angeforderte Verzeichnis existiert.

Mit „-d“ wird „true“ zurückgegeben, wenn das angeforderte Verzeichnis existiert. Andernfalls wird „false“ zurückgegeben.
Mit „!-d“ wird „true“ zurückgegeben, wenn das angeforderte Verzeichnis nicht existiert, das übergeordnete Verzeichnis der Anforderung jedoch vorhanden ist. Wenn das übergeordnete Verzeichnis nicht existiert, wird „false“ zurückgegeben. Außerdem gibt es einige weitere Syntaxen, die hier nicht näher erläutert werden.

Jetzt verwenden wir die if-Direktive, um nginx etwas Urteilsvermögen hinzuzufügen. Wenn wir beispielsweise http://xxx.abc.com:8080/home besuchen und $host = 'xxx.abc.com' ist, werden wir umleiten. Der nginx-Konfigurationscode lautet wie folgt:

Server {
 hören Sie 8088;
 Servername xxx.abc.com;
 Standort / {
  Proxy-Passwort http://127.0.0.1:3001;
  wenn ($host = 'xxx.abc.com') {
   Umschreiben ^/(.*) http://www.cnblogs.com Weiterleitung;
  }
 }
}

Wenn wir mit nginx wie oben konfiguriert sind und http://xxx.abc.com:8088 aufrufen, erfolgt eine Weiterleitung zu http://www.cnblogs.com.

Beispielsweise mehr Beurteilungen, wie etwa, ob auf den Benutzeragenten über ein Mobiltelefon zugegriffen wird, direkt zu einer bestimmten Seite gesprungen wird oder ob die „if“-Beurteilung verwendet wird. Zum Beispiel:

wenn ( $http_user_agent ~* "(Android)|(iPhone)|(Mobil)|(WAP)|(UCWEB)" ){
 umschreiben ^/$ http://www.cnblogs.com permanent;
}

4: Anti-Hotlinking und Nginx-Konfiguration verstehen

Was ist Anti-Hotlinking? Unter Hotlinking versteht man das Stehlen von Bildlinks, also das Stehlen von Bildern anderer und deren Verwendung auf dem eigenen Server. Unter Anti-Hotlinking versteht man das Verhindern, dass andere meine Bilder stehlen.

Das Implementierungsprinzip von Anti-Hotlinking: Wenn ein Client Ressourcen von einem Server anfordert, überträgt der Server im Allgemeinen nicht alle Ressourcen auf einmal vollständig an den Client zurück, um die Netzwerkbandbreite zu reduzieren und die Antwortzeit zu verbessern. Wenn Sie beispielsweise eine Webseite anfordern, wird zuerst der Textinhalt der Webseite zurückgegeben. Wenn der Clientbrowser beim Parsen des Textes feststellt, dass ein Bild vorhanden ist, initiiert er erneut eine Anforderung der Bildressource an den Server, und der Server sendet die gespeicherte Bildressource an den Client. Aber was passiert, wenn dieses Bild mit dem Server einer anderen Site verknüpft ist? In meinem Projekt habe ich beispielsweise auf ein Bild von Taobao verwiesen. Wenn unsere Website dann neu geladen wird, wird der Taobao-Server angefordert, was wahrscheinlich zu einer Belastung des Taobao-Servers führt. Das ist also Hotlinking. Daher müssen wir Anti-Hotlinking implementieren.

Implementieren Sie Anti-Hotlinking: Verwenden Sie das Referer-Header-Feld im Anforderungsheader des HTTP-Protokolls, um die Quelladresse der aktuell aufgerufenen Webseite oder Datei zu ermitteln. Durch den Wert dieses Header-Felds können wir die Quelladresse des Zugriffs auf die Zielressource ermitteln. Handelt es sich bei der Zielquelladresse nicht um die URL unserer eigenen Site, ergreifen wir in diesem Fall Sperrmaßnahmen, um Hotlinking zu verhindern. Beachten Sie jedoch, dass der Wert im Referer-Header-Feld geändert werden kann. Daher kann diese Methode Hotlinking nicht vollständig verhindern.

Verwenden Sie die Rewrite-Funktion des Nginx-Servers, um Anti-Hotlinking zu implementieren.

In Nginx gibt es die Direktive valid_referers. Mit dieser Direktive kann der Wert im Header-Feld Referer abgerufen und der globalen Nginx-Variable $invalid_referer basierend auf diesem Wert ein Wert zugewiesen werden. Wenn das Referer-Headerfeld keinen Wert enthält, der mit der valid_referers-Direktive übereinstimmt, wird der Variable $invalid_referer der Wert 1 zugewiesen.

Die grundlegende Syntax der Direktive valid_referers lautet wie folgt:

valid_referers keine | blockiert | Servernamen | Zeichenfolge

keine: Erkennt das Fehlen des Referer-Headerfelds.
blockiert: Erkennt Situationen, in denen der Wert des Referer-Header-Felds von einer Firewall oder einem Proxy-Server gelöscht oder verschleiert wird. In diesem Fall beginnt der Wert dieses Header-Feldes nicht mit „http://“ oder „https://“.

server_names: Legen Sie eine oder mehrere URLs fest und prüfen Sie, ob der Wert des Referer-Headerfelds eine der URLs ist.

Wenn wir also die Direktive valid_referers und die Variable $invalid_referer haben, können wir Anti-Hotlinking über die Rewrite-Funktion implementieren.
Nachfolgend stellen wir zwei Lösungen vor: Erstens: basierend auf der Art der angeforderten Ressourcen. Zweitens: Basierend auf dem Anforderungsverzeichnis.

1. Die folgende Tabelle listet die Anti-Hotlink-Konfiguration basierend auf dem angeforderten Dateityp auf:

Server {
 hören Sie 8080;
 Servername xxx.abc.com
 Standort ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
  valid_referers, keine blockiert, www.xxx.com, www.yyy.com, *.baidu.com, *.tabobao.com;
  wenn ($ungültiger_Referrer) {
   umschreiben ^/ http://www.xxx.com/images/forbidden.png;
  }
 }
}

Wenn bei der obigen Basiskonfiguration über eine Netzwerkverbindung Bildressourcen mit den Suffixen gif, jpg oder png, Medienressourcen mit den Suffixen swf oder flv oder komprimierte Ressourcen mit den Suffixen rar oder zip angefordert werden und festgestellt wird, dass das Referrer-Headerfeld nicht der valid_referers-Direktive entspricht, bedeutet dies, dass die Anforderung nicht für Ressourcen von dieser Site bestimmt ist.

Standort ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ Diese Konfiguration bedeutet, dass der Dateityp für Anti-Hotlinking festgelegt wird.

valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com; Es kann als Whitelist verstanden werden, eine Whitelist von Domänennamen, die Dateilinks zulassen. Wenn die angeforderte Ressourcendatei nicht mit diesen Domänennamen beginnt, bedeutet dies, dass die angeforderte Ressourcendatei keine Anforderung unter dieser Domäne ist und daher als Hotlink beurteilt werden kann. Wenn die Anfrage nicht unter dieser Domäne liegt, wird Rewrite verwendet, um auf das Bild http://www.xxx.com/images/forbidden.jpg umzuleiten. Wenn dieses Bild beispielsweise ein x oder ein anderes Logo ist, können andere Websites nicht auf Ihr Bild zugreifen.

2. Die Konfiguration zur Implementierung von Anti-Hotlinking basierend auf dem Anforderungsverzeichnis lautet wie folgt:

Server {
 hören Sie 8080;
 Servername xxx.abc.com
 Speicherort /Datei/ {
  root /server/datei/;
  valid_referers, keine blockiert, www.xxx.com, www.yyy.com, *.baidu.com, *.tabobao.com;
  wenn ($ungültiger_Referrer) {
   umschreiben ^/ http://www.xxx.com/images/forbidden.png;
  }
 }
}

Damit ist dieser Artikel mit der detaillierten Erläuterung der Umleitungskonfiguration und -praxis von Rewrite in Nginx abgeschlossen. Weitere relevante Inhalte zur Nginx Rewrite-Umleitung finden Sie in früheren Artikeln auf 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:
  • Zusammenfassung der Methode zur 301-Umleitung von Domänennamen unter Nginx
  • Detaillierte Erläuterung der Nginx-Konfiguration URL-Umleitung-Reverse-Proxy
  • Detaillierte Erklärung der Umleitungsfunktion in Nginx
  • So leiten Sie den Nginx-Verzeichnispfad um
  • So leiten Sie die Nginx-Adresse um
  • Beispiel für eine Nginx-Umleitungskonfiguration
  • Detaillierte Erläuterung der Nginx 301-Umleitungskonfiguration
  • Referenzhandbuch zur Konfiguration der Nginx-Serverumleitung
  • Beispiel zum Abrufen des Domänennamens bei Nginx-Umleitungen

<<:  Beispiel für die Ausführung eines MySQL-Befehlszeilenskripts

>>:  Fallstudie zu JavaScript Anti-Shake

Artikel empfehlen

Interviewer stellen häufig Fragen zum Lebenszyklus von React

React-Lebenszyklus Zwei Bilder zum besseren Verst...

So installieren Sie den RabbitMQ-Server mit Yum auf CentOS

Socat muss vor der Installation von rabbitmq inst...

Überlegungen zur Partitionierung von MySQL-Datenbanktabellen [empfohlen]

Die Tabellenpartitionierung unterscheidet sich vo...

CentOS8-Installationstutorial für JDK8/Java8 (empfohlen)

Vorwort Zuerst wollte ich es mit wget auf CentOS8...

Vue implementiert das Bild mit Schaltflächenwechsel

In diesem Artikelbeispiel wird der spezifische Co...

js Implementierung des Verifizierungscode-Falls

In diesem Artikelbeispiel wird der spezifische Co...

So erstellen Sie ein responsives Säulendiagramm mit dem CSS-Rasterlayout

Ich spiele jetzt schon eine Weile mit Diagrammen ...

10 tödliche semantische Fehler in der Webtypografie

<br />Dies stammt aus dem Inhalt von „Web Fr...

Verwendung und Unterschied von Vue.set() und this.$set()

Wenn wir Vue zur Entwicklung verwenden, kann eine...