nginx proxy pass redireciona a porta de ignorar

27

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:

link

Quando eu chamo um redirecionamento para '/ app' do nó, o redirecionamento real vai para:

link

    
por Paul 23.02.2012 / 21:20

5 respostas

11

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/;
    
por 28.03.2012 / 00:39
38

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.

    
por 16.07.2012 / 02:43
30

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.

    
por 27.10.2015 / 16:20
3

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 !!

    
por 27.08.2016 / 18:59
0

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:

por 14.06.2018 / 22:55