redirecionamentos de passagem de proxy nginx ignoram a porta


34

Então, eu estou configurando um caminho virtual ao apontar para um aplicativo node.js. no meu nginx conf. 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 um exemplo, a caixa dev está executando o nginx na porta 8080 e, portanto, os URLs para a raiz do aplicativo do nó se parecem com:

http: // localhost: 8080 / app

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

http: // localhost / app


Aqui estão algumas respostas que sugerem o uso: proxy_set_header Host $ http_host; Mas ninguém disse que isso pode causar vulnerabilidade (ataque ao cabeçalho do host). Exemplo de ataque aqui E mais informações aqui

Respostas:


14

O problema é que o aplicativo Node.js. não está emitindo o redirecionamento corretamente. Você pode usar isso proxy_redirectpara corrigir isso no nginx:

proxy_redirect http://localhost/ http://localhost:8080/;

47

Eu apenas tive que resolver o mesmo problema com Jenkins correndo atrás do nginx. O que fiz para mim foi incluir a porta do servidor no Hostcabeçalho que está sendo enviado para Jenkins:

proxy_set_header Host $host:$server_port;

Espero que ajude.


3
Bingo. como @mgorven diz, nó está definindo o redirecionamento mal, porque nginx está encaminhando o anfitrião mal
Eric

5

Tentei as soluções acima, mas todas elas falhavam sempre que o aplicativo do nó emitia uma URL totalmente qualificada no cabeçalho do local, como " http://nodeapp.com:8080/new/location "

Então acabei usando o $ http_host para passar o host e a porta. E usando uma correspondência para reescrever os URLs inteiramente.

  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;

No nosso caso, o servidor Node está sendo executado no 8080 e nosso proxy nginx está sendo executado no 8000. Isso significa que todo URL completo no cabeçalho de um local precisa ser reescrito. Espero que isso ajude alguém !!


4

De acordo com a conversa sobre essa questão , a resolução correta é ajustar a Hostdiretiva de cabeçalho do proxy .

Mude isso:

proxy_set_header Host $host;

Para isso:

proxy_set_header Host $http_host;

$http_hostmantém o valor especificado no cabeçalho HTTP HOST, que inclui a porta. Os redirecionamentos devem selecionar a porta personalizada sem personalização adicional para a configuração do OP.

Essas respostas (o mesmo ticket) são mais elaboradas:

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.