web-dev-qa-db-fra.com

Comment les paramètres de chaîne de requête peuvent-ils être transmis via un proxy_pass avec nginx?

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

L'extrait ci-dessus redirigera les demandes dans lesquelles l'URL inclut la chaîne "service" vers un autre serveur, mais sans paramètres de requête.

86
Alex Luya

Depuis le proxy_pass documentation:

Un cas particulier utilise des variables dans l'instruction proxy_pass: l'URL demandée n'est pas utilisée et vous êtes entièrement responsable de la construction de l'URL cible vous-même.

Puisque vous utilisez $ 1 dans la cible, nginx compte sur vous pour lui indiquer exactement ce qu'il doit transmettre. Vous pouvez résoudre ce problème de deux manières. Premièrement, effacer le début de l'URI avec un proxy_pass est 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/;
}

Ou si vous voulez utiliser l'emplacement de regex, incluez simplement les arguments:

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

J'utilise une version légèrement modifiée de la seconde approche de kolbyjack avec ~ au lieu de ~*.

location ~ ^/service/ {
  proxy_pass http://Apache/$uri$is_args$args;
}
22
Sebastian vom Meer

J'ai modifié le code @kolbyjack pour le faire fonctionner 

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

avec des paramètres

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

vous devez utiliser rewrite pour passer les paramètres à l'aide de proxy_pass Voici un exemple que j'ai fait pour le déploiement de l'application angularjs sur s3

S3 Static Hosting Route Route Tous les chemins d'accès à Index.html

adopté à vos besoins serait quelque chose comme

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

si vous voulez vous retrouver dans http://127.0.0.1:8080/query/params/

si vous voulez vous retrouver dans http://127.0.0.1:8080/service/query/params/ vous aurez besoin de quelque chose comme

location /service/ {
    rewrite ^\/(.*) /$1 break;
    proxy_pass http://Apache;
}
4
Andrew Arnautov

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
1
AnJia

Pour rediriger sans chaîne de requête, ajoutez les lignes ci-dessous dans le bloc serveur sous la ligne d'écoute:

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

Avec la chaîne de requête:

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