upstream reverso proxy_redirect proxy_pass proxy_cache_lock_timeout headers example parameters nginx

parameters - reverso - proxy headers nginx



¿Cómo se pueden enviar los parámetros de cadena de consulta a través de un proxy_pass con nginx? (6)

upstream apache { server 127.0.0.1:8080; } server{ location ~* ^/service/(.*)$ { proxy_pass http://apache/$1; proxy_redirect off; } }

El fragmento de arriba redirigirá las solicitudes donde la URL incluye el "servicio" de cadena a otro servidor, pero no incluye parámetros de consulta.


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 usted es totalmente responsable de construir la URL objetivo usted mismo.

Como usa $ 1 en el objetivo, nginx depende de usted para decirle exactamente qué pasar. Puedes arreglar esto de dos maneras. En primer lugar, quitar el comienzo del 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 quieres usar la ubicación de expresiones regulares, solo incluye los argumentos:

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


Modifiqué el código de @kolbyjack para que funcione

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

con parámetros

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


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

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

Con Query String

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


Utilizo una versión ligeramente modificada del segundo enfoque de kolbyjack con ~ lugar de ~* .

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


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


tienes que usar reescribir para pasar los parámetros usando proxy_pass aquí está el ejemplo que hice para la implementación de la aplicación angularjs en s3

Sitio web estático de S3 Hospedaje Route All Paths to Index.html

adoptado a sus necesidades sería algo así como

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

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

si quieres terminar en http://127.0.0.1:8080/service/query/params/ necesitarás algo como

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