El proxy proxy nginx redirige ignora el puerto

34

Así que estoy configurando una ruta virtual cuando apunto a una aplicación node.js en mi nginx conf. la sección relevante se ve así:

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 muy bien, excepto que cuando mi aplicación node.js (una aplicación express) llama a una redirección.

Como ejemplo, el cuadro de desarrollo está ejecutando nginx en el puerto 8080, por lo que la URL de la raíz de la aplicación de nodo se ve así:

http: // localhost: 8080 / app

Cuando llamo a una redirección a '/ aplicación' desde el nodo, la redirección real va a:

http: // localhost / app

Paul
fuente
Aquí algunas respuestas que sugieren usar: proxy_set_header Host $ http_host; Pero nadie dijo que puede causar vulnerabilidad (ataque de encabezado de host). Ejemplo de ataque aquí Y más información aquí

Respuestas:

14

El problema es que la aplicación Node.js no está emitiendo la redirección correctamente. Puede usarlo proxy_redirectpara corregir esto en nginx:

proxy_redirect http://localhost/ http://localhost:8080/;
mgorven
fuente
47

Solo tenía que resolver el mismo problema con Jenkins ejecutándose detrás de nginx. Lo que hizo por mí fue incluir el puerto del servidor en el Hostencabezado que se envía a Jenkins:

proxy_set_header Host $host:$server_port;

Espero que ayude.

Vojislav Stojkovic
fuente
3
Bingo. como dice @mgorven, el nodo está configurando mal la redirección, porque nginx está reenviando mal el host
Eric
5

Probé las soluciones anteriores, pero todas fallaron cada vez que la aplicación de nodo emitió una URL totalmente calificada en el encabezado de ubicación, como " http://nodeapp.com:8080/new/location "

Así que terminé usando $ http_host para pasar el host y el puerto. Y usando una coincidencia ~ ^ para reescribir las URL por completo.

  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;

En nuestro caso, el servidor Node se ejecuta en 8080 y nuestro proxy nginx se ejecuta en 8000. Esto significa que cada URL totalmente calificada en un encabezado de ubicación debe reescribirse. Espero que esto ayude a alguien !!

Mark Riggins
fuente
4

Según la conversación sobre esta pregunta , la resolución adecuada es ajustar la Hostdirectiva de encabezado del proxy .

Cambia esto:

proxy_set_header Host $host;

A esto:

proxy_set_header Host $http_host;

$http_hostcontiene el valor especificado en el encabezado HTTP HOST, que incluye el puerto. Los redireccionamientos deben elegir el puerto personalizado sin más personalización para la configuración de OP.

Estas respuestas (mismo boleto) elaboran más:

Frank Koehl
fuente