176 votes

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

amont apache {
   serveur 127.0.0.1:8080;
}
serveur{
   emplacement ~* ^/service/(.*)$ {
      proxy_pass http://apache/$1;
      proxy_redirect off;
   }
 }

Le snippet ci-dessus redirigera les requêtes où l'URL inclut la chaîne "service" vers un autre serveur, mais il n'inclut pas les paramètres de requête.

275voto

kolbyjack Points 4721

Depuis la documentation proxy_pass:

Un cas spécial est l'utilisation des variables dans l'instruction proxy_pass: L'URL demandée n'est pas utilisée et vous êtes entièrement responsable de construire vous-même l'URL cible.

Étant donné que vous utilisez $1 dans la cible, nginx compte sur vous pour lui dire exactement quoi passer. Vous pouvez corriger cela de deux manières. Tout d'abord, il est facile de supprimer le début de l'URI avec un proxy_pass:

location /service/ {
  # Notez le slash final sur le proxy_pass.
  # Cela indique à nginx de remplacer /service/ par / lors du passage de la requête.
  proxy_pass http://apache/;
}

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

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

42voto

SebastianG Points 1839

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

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

19voto

Andrew Arnautov Points 267

Vous devez utiliser rewrite pour passer des paramètres en utilisant proxy_pass voici un exemple que j'ai fait pour le déploiement de l'application angularjs sur s3

Hébergement de site Web statique S3 Rediriger tous les chemins vers Index.html

adapté à vos besoins serait quelque chose comme

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

si vous voulez arriver à http://127.0.1:8080/query/params/

si vous voulez arriver à 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;
}

12voto

Pranav Garg Points 543

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

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

avec des paramètres

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

1 votes

Gardez à l'esprit que cela fera en sorte que le serveur renvoie une réponse 301 au client avant de rediriger. La directive proxy_pass ci-dessus effectue la redirection côté serveur.

2 votes

Cela va se casser si vos paramètres de requête contiennent des caractères encodés d'URL (%). Utilisez plutôt la réponse d'Andrew.

0 votes

Cette réponse n'a rien à voir avec un reverse proxy. Si par exemple service_url n'est pas atteignable directement depuis Internet (ce qui est très probable dans un scénario de reverse proxy), cela échouera complètement. De plus, cela indique au client qu'il devrait utiliser l'URL de redirection directement la prochaine fois (301 déplacé de façon permanente), ce qui n'est probablement pas souhaitable dans ce cas également.

8voto

Tobias Sgoff Points 31

A travaillé avec l'ajout de $request_uri :
proxy_pass http://apache/$request\_uri;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X