Lösung für das Problem des Sitzungsfehlers, der durch den Nginx-Reverse-Proxy verursacht wird

Lösung für das Problem des Sitzungsfehlers, der durch den Nginx-Reverse-Proxy verursacht wird

Ein Kollege bat um Hilfe: Die Anmeldung beim Backend-System war erfolgreich, die Anmeldung am System konnte jedoch nicht erfolgreich durchgeführt werden und es sprang trotzdem auf die Anmeldeseite, mit dem gleichen Codesatz in einer anderen Umgebung traten jedoch keine Probleme auf.

Hintergrund

Es stellte sich heraus, dass er Tomcat verwendete, um zwei Umgebungen für dasselbe Projekt bereitzustellen, eine auf dem Entwicklungsserver und eine auf seinem lokalen Computer. Die Codekonfigurationen der beiden Umgebungen waren genau gleich. Beide Seiten verwenden dasselbe Nginx für den Reverse-Proxy. Die Nginx-Konfiguration lautet wie folgt:

Standort /Gesundheit/ {
  proxy_pass http://192.168.40.159:8081/health/; #Kein Problem mit der Konfiguration}

Standort /health-dev/ {
  proxy_pass http://192.168.40.202:8080/health/; #Problematische Konfiguration}

Ein Reverseproxy zur Entwicklungsumgebung und ein Reverseproxy zum lokalen Dienst.

Position

Da die Codekonfiguration genau dieselbe ist, liegt das Problem höchstwahrscheinlich beim Nginx-Reverse-Proxy.

Da die Standortpfade auf beiden Seiten unterschiedlich sind (dh die Browserpfade sind unterschiedlich), die Serverpfade des Reverse-Proxys jedoch gleich sind, werden die Grundprinzipien der Sitzung kombiniert, wie in der folgenden Abbildung dargestellt.

  1. Wenn der Browser die Seite zum ersten Mal öffnet, erstellt der Server eine Sitzung für diese Sitzung und übergibt die Sitzungs-ID über den Antwortheader an den Browser. Der Header lautet normalerweise Set-Cookie: JSESSIONID=xxxxx; Path=xxxx
  2. Nachdem der Browser die Antwort erhalten hat, wird der Header-Wert im Cookie des Browsers gespeichert, sofern der Pfadwert im Header-Set-Cookie mit dem Adresspfad des Browsers übereinstimmt.
  3. Wenn der Browser das nächste Mal den Server anfordert, meldet er dem Server den JSESSIONID-Wert im Cookie über den Anforderungsheader. Der Header lautet normalerweise Cookie: JSESSIONID=xxxx;
  4. Der Server kann die JSESSIONID verwenden, um die entsprechende Sitzung zu lokalisieren

Wenn der Nginx Reverse Proxy auf diese Weise konfiguriert ist

Standort /health-dev/ {
  Proxy-Passwort http://192.168.40.202:8080/health/;
}

Wenn der Browser auf http://www.domian.com/health-dev zugreift, lautet der vom Server zurückgegebene Pfadwert von Set-Cookie /health (da sich in der Mitte ein Reverse-Proxy befindet, kennt der Server den Pfad vor dem Proxy nicht und wird entsprechend dem Pfad der endgültigen Anforderung an den Server festgelegt), wie in der Abbildung dargestellt.

Da der Pfad /health-dev der Browser-Zugriffsadresse nicht mit dem Pfad /health von Set-Cookie übereinstimmt, speichert der Browser seinen Wert nicht im Cookie, wie in der Abbildung gezeigt

Daher kann der Browser bei Ihrer nächsten Anforderung JSESSIONID Wert des Cookie Headers der Anforderung nicht festlegen und der Server kann die entsprechende Sitzung nicht finden. Daher behandelt er sie als erste Anforderung und erstellt eine neue Sitzung usw. Selbst wenn Ihre Anmeldeauthentifizierung erfolgreich war, speichert der Browser daher die vom Server zurückgegebenen Anmeldeinformationen (JSESSIONID) nicht und überträgt sie nicht mit der nächsten Anforderung. Dadurch denkt der Server, dass es sich um eine neue Anforderung handelt, und springt natürlich erneut zur Anmeldeseite.

lösen

nginx verfügt über einen Befehl proxy_cookie_path (Referenz: proxy_cookie_path), der den vom Server zurückgegebenen Pfad in Set-Cookie ändern kann. Das Format ist proxy_cookie_path 原路徑目標路徑. Wir fügen proxy_cookie_path der Konfiguration wie folgt hinzu.

Standort /health-dev/ {
  Proxy-Passwort http://192.168.40.202:8080/health/;
  Proxy-Cookie-Pfad /health /health-dev;
}

Starten Sie nginx neu und das Problem ist gelöst.

Dies ist das Ende dieses Artikels zur Lösung des Problems der Sitzungsungültigkeit, das durch den Nginx-Reverse-Proxy verursacht wird. Weitere Informationen zur Sitzungsungültigkeit, die durch den Nginx-Reverse-Proxy verursacht wird, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Nginx Reverse-Proxy-Implementierung zur Unterstützung langer Verbindungen
  • Implementierung von HTTP- und HTTPS-Diensten mit Nginx-Reverse-Proxy für mehrere Domänennamen
  • Nginx Reverse Proxy Springboot JAR-Paket-Prozessanalyse
  • Detaillierte Erläuterung der Nginx-Konfigurationsparameter auf Chinesisch (Lastausgleich und Reverse-Proxy)
  • Detaillierte Erläuterung des Nginx-Forward-Proxys und des Reverse-Proxys
  • Unterschied und Prinzipanalyse des Nginx-Forward- und Reverse-Proxy
  • Konfigurationscodebeispiel für Nginx-Forward- und Reverse-Proxy sowie Lastausgleichsfunktionen
  • So halten Sie eine lange Verbindung aufrecht, wenn Sie den Nginx-Reverse-Proxy verwenden

<<:  Problem der Inkonsistenz der MySQL-Multiplikations- und Divisionsgenauigkeit (vier Dezimalstellen nach der Division)

>>:  Lösungen für Probleme bei der Verwendung von addRoutes in Vue-Projekten

Artikel empfehlen

Zwei Möglichkeiten zum korrekten Bereinigen von MySQL-Binlog-Protokollen

mysql bereinigt Binlog-Protokolle korrekt Vorwort...

Ausführliches Tutorial zur Installation von MySQL 5.6-ZIP-Paketen

Bisher haben wir alle Dateien mit der Endung .msi...

Geben Sie einige Tipps zur Verwendung von JavaScript-Operatoren

Inhaltsverzeichnis 1. Optionaler Verkettungsopera...

JavaScript implementiert das Topfschlagen-Spiel von Gray Wolf

1. Projektdokumente 2. Verwenden Sie HTML und CSS...

CentOS 8.0.1905 installiert ZABBIX Version 4.4 (verifiziert)

Zabbix Server-Umgebungsplattform Version: ZABBIX ...

Beispiel für eine Vue-Datenanzeige auf einem großen Bildschirm

Um die Anforderungen effizient zu erfüllen und au...

Detaillierte Erläuterung der Kubernetes-Pod-Orchestrierung und des Lebenszyklus

Inhaltsverzeichnis K8S Master Grundlegende Archit...

Kleine Details der Web-Frontend-Entwicklung

1 Das Select-Tag muss geschlossen sein <select&...

MySQL Online-Übung zur Deadlock-Analyse

Vorwort Ich glaube, dass jeder beim Erlernen von ...

Lösung für den ineffektiven Rand von in HTML verschachtelten Divs

Hier ist eine Lösung für das Problem, dass der Ra...

Der Vue.js-Cloud-Speicher realisiert die Bild-Upload-Funktion

Vorwort Tipp: Das Folgende ist der Hauptinhalt di...

Detaillierte Erklärung der einfachen HTML- und CSS-Verwendung

Ich werde drei Tage benötigen, um den statischen ...