Falsche relative Pfadumleitung mit Nginx

Falsche relative Pfadumleitung mit Nginx

Ich möchte einen Reverse-Proxy mit Nginx implementieren, um Zugriff auf eine Webanwendung zu erhalten. Ich habe Schwierigkeiten mit Weiterleitungen. Nehmen wir zum Beispiel an, ich habe einen Python-HTTP-Server (in der Praxis kann ich die Servereinstellungen/den Code nicht ändern):

import http.server
import socketserver

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/login':
            self.path = 'login.html'
        elif self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/login')
            self.end_headers()
        return http.server.SimpleHTTPRequestHandler.do_GET(self)

handler_object = MyHttpRequestHandler
serv = socketserver.TCPServer(("127.0.0.1", 8080), handler_object)

Ich habe die folgende Konfiguration für Nginx:

location /app {
        proxy_pass http://127.0.0.1:8080;
}

Wenn ich gehehttps://myip/app/, ich sollte weitergeleitet werden zuhttps://myip/app/login. Stattdessen werde ich weitergeleitet zuhttps://myip/login, das nicht geroutet wird. Ich habe verschiedene Parameter wie proxy_redirect, proxy_headers... ohne Erfolg ausprobiert.

Antwort1

Ihre Python-Anwendung leitet zu weiter /login, daher fordert der Browser an,

https://myip/login

Dadurch wird Ihre /appStandortsperre umgangen.

Ich kann Ihnen nicht wirklich eine Antwort geben, da ich Ihre Anforderungen nicht kenne, aber Folgendes wird funktionieren:

Ändern Sie Ihre Weiterleitung zu/app/login

In Ihrem Fall müssen Sie Nginx mitteilen, dass Sie die URI an die weitergeleitete Anfrage anhängen möchten:

Fügen Sie in Ihrer Nginx-Konfiguration der weitergeleiteten Anfrage die $request_url hinzu:

location /app {
    proxy_pass http://127.0.0.1:8080$request_uri;
}

/appFür mich ist das eine etwas instabile Lösung, die voraussetzt, dass Sie als Standort angeben müssen .

Idealerweise sollten Sie die Stamm-URI per Reverse-Proxy location /an die Python-App senden, um diese und andere potenzielle Anomalien zu beseitigen. Sie können dann in der Nginx-Konfiguration spezifische Ausnahmen erstellen, wenn es bestimmte Anfragen (z. B. CDN) gibt, die nicht an die Python-Anwendung gesendet werden sollen.

Antwort2

das sollte funktionieren

    > location /app {
    >         proxy_pass http://127.0.0.1:8080/; 
}

Der abschließende Schrägstrich leitet Ihre Anfrage mit dem Pfad weiter.

verwandte Informationen