Redirecionamento de proxy reverso Nginx


13

Estou usando nginxcomo proxy reverso e, quando faço login na minha interface da Web, sou redirecionado para o URL em proxy. Eu gostaria de evitá-lo e sempre manter o "server_name" como a URL. É possível?

Este é o meu /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Eu me conecto http://my-app.net, insiro as informações de login, sou redirecionado para http://ip_of_the_app:7180a mesma página de login e preciso fazer login novamente. Esse login duplo pode ser evitado?


tonio94, seu problema foi solucionado? se sim, aceite a resposta. caso contrário, esclareça o que está faltando.
CNST

2
Acabei de testar ontem, funciona, proxy_redirect precisa ser removido. Obrigado pela ajuda.
precisa saber é

Respostas:


25

Não defina proxy_redirectcomo off, isso não está fazendo o que você pensa que está fazendo. proxy_redirectexecuta algo semelhante à reescrita de URL, por exemplo:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

Isso permite que você hospede o /sales/caminho em outro lugar. Mas, mesmo assim, os parâmetros padrão para proxy_redirectfazer exatamente isso de graça. O padrão é redirecionar o local para o que estiver presente proxy_pass(e os parâmetros padrão são usados ​​quando você não define proxy_redirectnem usa proxy_redirect default;).

Você não precisa definir proxy_redirect.


O que você está perdendo são os cabeçalhos que precisam ser enviados ao aplicativo. O mais importante deles é HOST. Isso deve executar o proxy conforme desejado e manter o URL correto no navegador.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

Observe que o aplicativo em http://ip_of_the_app:7180/agora receberá a solicitação com o Host: my-app.netcabeçalho.


Você também deve considerar usar mais alguns cabeçalhos:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Isso permitirá um melhor registro dentro do aplicativo em http://ip_of_the_app:7180/. X-Forwarded-Forfornecendo o IP do cliente real (em oposição ao nginxIP s) e X-Forwarded-Protoverificar se o cliente se conectou ao nginxHTTP ou HTTPS através de.


Obrigado pela ajuda. proxy_redirect não é necessário, mas o referenciador proxy_set_header ip_of_the_app: 7180 deve ser configurado para funcionar corretamente.
tonio94

@ tonio94 - Obrigado, atualizei a resposta. Observe que o uso normal do Refereré simplesmente o $http_refererque o copia da solicitação. Isso não funciona se a solicitação não tiver um cabeçalho Referer, portanto, a codificação é uma solução em alguns casos.
grochmal 11/07

@ JonathanKomar - Obrigado por isso, você está correto, agora editado. Desculpe, demorei um pouco para notar seu comentário.
grochmal 4/09/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.