Il proxy pass nginx reindirizza ignora la porta


34

Quindi sto impostando un percorso virtuale quando si punta a un'app node.js nella mia conf. Nginx. la sezione pertinente si presenta così:

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;
}

Funziona alla grande, tranne che quando la mia app node.js (un'app express) chiama un reindirizzamento.

Ad esempio, la casella di sviluppo esegue nginx sulla porta 8080 e quindi l'URL alla radice dell'app nodo appare come:

http: // localhost: 8080 / app

Quando chiamo un reindirizzamento a '/ app' dal nodo, il reindirizzamento effettivo va a:

http: // localhost / app


Ecco alcune risposte che suggeriscono l'uso: proxy_set_header Host $ http_host; Ma nessuno ha detto che può causare vulnerabilità (attacco dell'intestazione host). Esempio di attacco qui E maggiori informazioni qui

Risposte:


14

Il problema è che l'applicazione Node.js non sta emettendo correttamente il reindirizzamento. Potresti essere in grado di utilizzare proxy_redirectper correggere questo in nginx:

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

47

Ho dovuto risolvere lo stesso problema con Jenkins che corre dietro a nginx. Quello che ha fatto per me è stato quello di includere la porta del server Hostnell'intestazione che viene inviata a Jenkins:

proxy_set_header Host $host:$server_port;

Spero che sia d'aiuto.


3
Bingo. come dice @mgorven, il nodo sta impostando male il reindirizzamento, perché nginx sta inoltrando male l'host
Eric

5

Ho provato le soluzioni precedenti, ma tutte hanno avuto esito negativo ogni volta che l'applicazione del nodo ha emesso un URL completo nell'intestazione della posizione, ad esempio " http://nodeapp.com:8080/new/location "

Quindi ho finito usando $ http_host per passare host e porta. E usando una corrispondenza ~ ^ per riscrivere interamente gli URL.

  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;

Nel nostro caso, il server Node è in esecuzione su 8080 e il nostro proxy nginx è in esecuzione su 8000. Ciò significa che ogni URL completo in un'intestazione di posizione deve essere riscritto. Spero che questo aiuti qualcuno !!


4

Per la conversazione su questa domanda , la risoluzione corretta è quella di regolare la Hostdirettiva dell'intestazione del proxy .

Cambia questo:

proxy_set_header Host $host;

A questa:

proxy_set_header Host $http_host;

$http_hostcontiene il valore specificato nell'intestazione HOST HTTP, che include la porta. I reindirizzamenti dovrebbero prelevare la porta personalizzata senza ulteriore personalizzazione alla configurazione dell'OP.

Queste risposte (stesso biglietto) elaborano ulteriormente:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.