Redirecionamento de caminho relativo incorreto com Nginx

Redirecionamento de caminho relativo incorreto com Nginx

Quero implementar um proxy reverso com Nginx para obter acesso a um aplicativo web. Encontrei dificuldades com redirecionamentos. Por exemplo, digamos que eu tenha um servidor http Python (na prática, não consigo modificar as configurações/código do 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)

Eu tenho a seguinte configuração para Nginx:

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

Quando eu for parahttps://meuip/app/, eu deveria ser redirecionado parahttps://myip/app/login. Mas em vez disso, sou redirecionado parahttps://meuip/login, que não é roteado. Tentei parâmetros diferentes como proxy_redirect, proxy_headers... sem sucesso.

Responder1

Seu aplicativo python está redirecionando para /login, então o navegador solicitará

https://myip/login

O que então ignora seu /appbloqueio de localização.

Na verdade, não posso lhe dar uma resposta, pois não sei quais são seus requisitos, mas o seguinte funcionará:

Altere seu redirecionamento para/app/login

No seu caso, você precisa informar ao Nginx que deseja anexar o URI na solicitação encaminhada:

Na configuração do Nginx, adicione $request_url à solicitação encaminhada:

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

Para mim, esta é uma solução um tanto frágil, que pressupõe que você precisa ter /appcomo localização.

Idealmente, você deve fazer proxy reverso do URI raiz location /para o aplicativo python para remover essas e outras anomalias potenciais. Você pode então criar exceções específicas na configuração do Nginx se houver certas solicitações (por exemplo, CDN) que não devem ir para o aplicativo python.

Responder2

isso deve funcionar

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

a barra final encaminhará sua solicitação com o caminho.

informação relacionada