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


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

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.


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


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:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.