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 Öffnen und Schließen des MySQL-Dienstes

Methode 1: Verwenden Sie den cmd-Befehl Öffnen Si...

Reines CSS zum Ändern der Layoutgröße durch Ziehen nach links und rechts

Nutzen Sie die Funktion „Non- overflow:auto - res...

So deinstallieren Sie MySQL 5.7 unter CentOS7

Überprüfen Sie, was in MySQL installiert ist grep...

So melden Sie sich unter Shell schnell ohne Kennwort bei der MySQL-Datenbank an

Hintergrund Wenn wir uns über den MySQL-Client in...

Tipps zur Konvertierung von MySQL-Spalten in Zeilen (teilen)

Vorwort: Weil viele Geschäftstabellen Entwurfsmus...

Eine SQL-Anweisung schließt die MySQL-Deduplizierung ab und behält eine

Als ich vor einigen Tagen an einer Anforderung ar...

Perfekte Lösung für das Zeitzonenproblem des Docker Alpine-Image

Als ich kürzlich Docker zum Bereitstellen einer J...

Codebeispiel für die Implementierung des Linux-Verzeichniswechsels

Das Wechseln von Dateien ist eine gängige Operati...

Einige gängige CSS-Layouts (Zusammenfassung)

Zusammenfassung In diesem Artikel werden die folg...

Detaillierte Erläuterung der Komponentenentwicklung des Vue-Dropdown-Menüs

In diesem Artikelbeispiel wird der spezifische Co...

So löschen Sie Junk-Dateien elegant in Linux

Ich frage mich, ob Sie wie ich ein Programmierer ...