
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 /app
Standortsperre 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;
}
/app
Fü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.