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