Nginx: ¿Cómo reenvío una solicitud http a otro puerto?

65

Lo que quiero hacer es

Cuando alguien visita http://localhost/route/abcel servidor responde exactamente igual quehttp://localhost:9000/abc

Ahora configuro mi Nginx así:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

La solicitud http se envía 9000correctamente al puerto , pero la ruta que recibió http://localhost:9000/route/abcno lo es http://localhost:9000/abc.

Cualquier sugerencia ?

MrROY
fuente

Respuestas:

65

Odio la sutileza aquí, pero intente agregar un / al final de 9000 como a continuación. Ya no agregará "ruta" a la solicitud reenviada ahora.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
Tiburón
fuente
44
Esta debería ser la respuesta aceptada. Simplemente agregar /está bien documentado como la forma de eliminar el prefijo que aparece en la ubicación.
Bernard
40

Creo que puede usar reescribir para eliminar la parte adicional de la URL. En su caso, creo que podría usar:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Sin embargo, si su aplicación tiene enlaces internos, aún pueden apuntar a / abc / foo, y si hace esto, en su lugar, deben apuntar a / route / abc / foo para que la solicitud sin procesar llegue correctamente. Es mejor dejar la configuración de nginx como está y, en su lugar, configurar su aplicación para que se dé cuenta de que vive en un subdirectorio, si puede.

Sé que esta es una vieja pregunta, ¡pero fue el mejor éxito de Google para mí cuando estaba tratando de resolver el mismo problema!

usuario2428107
fuente
Gracias ! en este enlace podemos revisar la lista de variables: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal
17

Intenta lo siguiente

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
ALex_hha
fuente
Esta solución funcionó mejor para mí, ya que conserva el nombre del host.
Shafique Jamal
Limpio y sencillo.
Ravshan Samandarov
7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

Este código escucha en 8080 y redirige al puerto 8787 en compute-1-36. Puede seleccionar otra ruta en la ubicación /

usuario3266656
fuente