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 ?

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

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!


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

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 /

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.