
Quiero implementar un proxy inverso con Nginx para acceder a una aplicación web. Tuve dificultades con las redirecciones. Por ejemplo, digamos que tengo un servidor http Python (en la práctica, no puedo modificar la configuración/código del servidor):
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)
Tengo la siguiente configuración para Nginx:
location /app {
proxy_pass http://127.0.0.1:8080;
}
Cuando voy ahttps://miip/aplicación/, debería ser redirigido ahttps://miip/app/login. Pero en lugar de eso, soy redirigido ahttps://miip/login, que no está enrutado. Probé diferentes parámetros como proxy_redirect, proxy_headers... sin éxito.
Respuesta1
Su aplicación Python está redirigiendo a /login
, por lo que el navegador solicitará
https://myip/login
Lo que luego pasa por alto su /app
bloqueo de ubicación.
Realmente no puedo darte una respuesta porque no sé cuáles son tus requisitos, pero lo siguiente funcionará:
Cambia tu redireccionamiento a/app/login
En su caso, debe decirle a Nginx que desea agregar el URI en la solicitud reenviada:
En su configuración de Nginx, agregue $request_url a la solicitud reenviada:
location /app {
proxy_pass http://127.0.0.1:8080$request_uri;
}
Para mí, esta es una solución un tanto frágil, que supone que debes tenerla /app
como ubicación.
Idealmente, debería realizar un proxy inverso del URI raíz location /
a la aplicación Python para eliminar estas y otras posibles anomalías. Luego puede crear excepciones específicas en la configuración de Nginx si hay ciertas solicitudes (por ejemplo, CDN) que no deberían ir a la aplicación Python.
Respuesta2
Esto debería funcionar
> location /app {
> proxy_pass http://127.0.0.1:8080/;
}
la barra diagonal reenviará su solicitud con la ruta.