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

Paulo
fonte
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/;
mgorven
fonte
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.

Vojislav Stojkovic
fonte
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 !!

Mark Riggins
fonte
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:

Frank Koehl
fonte