2011-04-29 19 views
47

Estaba tratando de usar el servidor de aplicaciones Thin y tuve un problema.Cómo conservar URL de solicitud con nginx proxy_pass

Cuando nginx proxies solicita Thin (o Unicornio) utilizando proxy_pass http://my_app_upstream; la aplicación recibe la URL modificada enviada por nginx (http://my_app_upstream).

Lo que quiero es pasar la URL original y la solicitud original del cliente sin modificaciones ya que la aplicación depende mucho de ella.

El nginx' doc dice:

Si es necesario transmitir URI en la forma no procesada a continuación, la directiva PROXY_PASS deben ser usadas sin URI parte.

Pero no entiendo exactamente cómo configurar que a medida que la muestra relacionada en realidad está utilizando URI:

location /some/path/ { 
    proxy_pass http://127.0.0.1; 
} 

Así podría por favor me ayude a encontrar la manera de preservar la URL solicitud original del cliente?

Respuesta

90

creo que la directiva proxy_set_header podría ayudar:

location/{ 
    proxy_pass http://my_app_upstream; 
    proxy_set_header Host $host; 
    # ... 
} 
+0

Acabo de descubrir lo mismo. Gracias. –

+57

Nota para otras personas que encuentran esto: El corazón de la solución para hacer que nginx no manipule la URL, es eliminar la barra al final de la directiva 'proxy_pass'. 'http: // my_app_upstream' vs' http: // my_app_upstream/' –

+1

Gracias @HugoJosefson: ese fue mi problema, ¡gracias por publicar! – dsldsl

9

Sólo proxy_set_header anfitrión $ host puerto fallida de mi caso. Resuelto por:



    location/{ 
    proxy_pass http://BACKENDIP/; 
    include /etc/nginx/proxy.conf; 
    } 

y luego en el proxy.conf



    proxy_redirect off; 
    proxy_set_header Host $host:$server_port; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

+0

Gracias, esta fue la pieza que me faltaba (el $ server_port) para obtener la verificación de OAuth trabajando en el punto final detrás del proxy. – renier

+0

Estoy usando rack-protection con sinatra y estaba prohibido en las URL POST. Al agregar el puerto al encabezado del proxy del host, lo solucioné por mí. – pduey

+0

esto ya no funciona en las últimas versiones de Nginx Creo que http://stackoverflow.com/questions/31482796/why-is-proxy-set-header-host-host-no-longer-working-in-nginx- 1-8-0? S = 1 | 3.2072 – iwein

1

Para perfectamente adelante sin cortar la absoluteURI de la solicitud y la Host en la cabecera:

server { 
    listen 35005; 

    location/{ 
     rewrite   ^(.*)$ "://$http_host$uri$is_args$args"; 
     rewrite   ^(.*)$ "http$uri$is_args$args" break; 
     proxy_set_header Host  $host; 

     proxy_pass   https://deploy.org.local:35005; 
    } 
} 

encontrado aquí : https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/

+0

Te amo hombre ... Solo este me lo resolvió ... –

0

nginx también provid es la variable $ http_host que pasará el puerto por ti. es una concatenación de host y puerto.

Así que solo tiene que hacer: proxy_set_header Host $ http_host;

Cuestiones relacionadas