O problema é que o aplicativo Node.js não está emitindo o redirecionamento corretamente. Você pode usar proxy_redirect
para corrigir isso no nginx:
proxy_redirect http://localhost/ http://localhost:8080/;
Estou configurando um caminho virtual ao apontar para um aplicativo node.js no meu conf nginx. a seção relevante é assim:
location /app {
rewrite /app/(.*) /$1 break;
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Funciona muito bem, exceto quando meu aplicativo node.js (um aplicativo expresso) chama um redirecionamento.
Como exemplo, a caixa dev está rodando nginx na porta 8080, e assim a url para a raiz do aplicativo do nó se parece com:
Quando eu chamo um redirecionamento para '/ app' do nó, o redirecionamento real vai para:
O problema é que o aplicativo Node.js não está emitindo o redirecionamento corretamente. Você pode usar proxy_redirect
para corrigir isso no nginx:
proxy_redirect http://localhost/ http://localhost:8080/;
Eu só tive que resolver o mesmo problema com Jenkins correndo atrás do nginx. O que para mim foi incluir a porta do servidor no cabeçalho Host
que está sendo enviado para o Jenkins:
proxy_set_header Host $host:$server_port;
Espero que ajude.
Eu tive esse problema e use $http_host
em vez de $host
trabalhado para mim, pois ele também inclui o número da porta.
Eu tentei as soluções acima, mas todas falharam sempre que o aplicativo do nó emitiu uma URL totalmente qualificada no cabeçalho do local, como " link "
Então acabei usando o $ http_host para passar o host e a porta. E usando um match ~ ^ para reescrever completamente as URLs.
proxy_pass http://10.0.0.3:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect default;
proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;
Em nosso caso, o servidor Node está sendo executado em 8080 e nosso proxy nginx está em execução em 8000. Isso significa que cada URL totalmente qualificado em um cabeçalho de local precisa ser reescrito. Espero que isso ajude alguém !!
De acordo com a pergunta , a resolução correta é ajustar a diretiva de cabeçalho Host
do proxy.
Altere isto:
proxy_set_header Host $host;
Para isso:
proxy_set_header Host $http_host;
$http_host
contém o valor especificado no cabeçalho HTTP HOST, que inclui a porta. Redirecionamentos devem pegar a porta personalizada sem mais personalização para a configuração do OP.
Essas respostas (mesmo ticket) são mais elaboradas: