2011-11-15 18 views

Respuesta

86

De la documentación proxy_pass:

Un caso especial es el uso de variables en la declaración PROXY_PASS: La URL solicitada no se utiliza y que es completamente responsable de construir la URL de destino mismo.

Dado que usa $ 1 en el objetivo, nginx depende de usted para decirle exactamente qué pasar. Puedes arreglar esto de dos maneras. En primer lugar, separar el comienzo de la URI con un PROXY_PASS es trivial:

location /service/ { 
    # Note the trailing slash on the proxy_pass. 
    # It tells nginx to replace /service/ with/when passing the request. 
    proxy_pass http://apache/; 
} 

O si desea utilizar la ubicación de expresiones regulares, basta con incluir los argumentos:

location ~* ^/service/(.*) { 
    proxy_pass http://apache/$1$is_args$args; 
} 
+1

no creo que pueda hacer esto último. Intenté y nginx se quejó conmigo. – duma

+1

Queja cómo? Acabo de probarlo en nginx 1.3.4 y funcionó bien para mí. – kolbyjack

+0

Humm ... No puedo recordar ahora :(Pero siento que podría haber estado relacionado con el "~ *". Sin embargo, acabo de comprobar y tengo nginx 1.2.3 (a través de homebrew). Tal vez eso es todo? – duma

17

utilizo una versión ligeramente modificada de El segundo acercamiento de kolbyjack con ~ en vez de ~*.

location ~ ^/service/ { 
    proxy_pass http://apache/$uri$is_args$args; 
} 
5

he modificado @kolbyjack código para hacer que funcione para

http://website1/service 
http://website1/service/ 

con parámetros

location ~ ^/service/?(.*) { 
    return 301 http://service_url/$1$is_args$args; 
} 
+1

Tenga en cuenta que esto hará que el servidor devuelva una respuesta 301 al cliente antes de redireccionar. La directiva 'proxy_pass' anterior hace la redirección en el lado del servidor. –

+0

Esto se romperá si sus parámetros de consulta contienen caracteres codificados URL (%). Use la respuesta de Andrew en su lugar. –

3

usted tiene que utilizar reescritura de pasar parametros utilizando PROXY_PASS aquí es lo que hice por ejemplo, Despliegue de la aplicación angularjs a s3

S3 Static Website Hosting Route All Paths to Index.html

adoptado para sus necesidades sería algo así como

location /service/ { 
    rewrite ^\/service\/(.*) /$1 break; 
    proxy_pass http://apache; 
} 

si quiere terminar en http://127.0.0.1:8080/query/params/

si quiere terminar en http://127.0.0.1:8080/service/query/params/ que necesita algo así como

location /service/ { 
    rewrite ^\/(.*) /$1 break; 
    proxy_pass http://apache; 
} 
+1

Parece que maneja parámetros de ruta ('/ path/params') pero no consulta parámetros ('? Query = params')? – Will

+0

Ah no, mi error, los parámetros de consulta deberían agregarse automáticamente (están en mis pruebas). – Will

-1

Para redirigir Sin cadena de consulta, agregue las siguientes líneas en el bloque Servidor bajo la línea del puerto de escucha

if ($uri ~ .*.containingString$) { return 301 https://$host/$uri/; }

Con cadena de consulta

if ($uri ~ .*.containingString$) { return 301 https://$host/$uri/?$query_string; }

+0

La documentación de nginx es explícita para evitar el uso de 'si' cuando sea posible. En este caso, la solución podría ser correcta usando 'location' como se muestra en otras respuestas. –

0

github GIST https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7

#set $token "?"; # deprecated 

set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?` 

if ($is_args) { # if the request has args update token to "&" 
    set $token "&"; 
} 

location /test { 
    set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token 
    # if no args $is_args is empty str,else it's "?" 
    # http is scheme 
    # service is upstream server 
    #proxy_pass http://service/$uri$is_args$args; # deprecated remove `/` 
    proxy_pass http://service$uri$is_args$args; # proxy pass 
} 

#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2 

#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2 
Cuestiones relacionadas