139 votes

Nginx : Comment transférer une requête HTTP vers un autre port ?

Ce que je veux faire, c'est : Quand quelqu'un visite http://localhost/route/abc le serveur répond exactement de la même manière que http://localhost:9000/abc

Maintenant je configure mon serveur Nginx comme ceci :

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

La requête HTTP est envoyée au port 9000 correctement, mais le chemin qu'il reçoit est http://localhost:9000/route/abc pas http://localhost:9000/abc .

Des suggestions ?

140voto

Shark Points 1181

Je déteste la subtilité ici, mais essayez d'ajouter un / à la fin de 9000 comme ci-dessous. Il n'ajoutera plus "route" à la requête transférée.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

10 votes

Cela devrait être la réponse acceptée. Il suffit d'ajouter / est bien documenté comme étant le moyen de supprimer le préfixe listé dans l'emplacement.

1 votes

Il devrait l'être location /route/

58voto

user2428107 Points 641

Je crois que vous pouvez utiliser la réécriture pour supprimer la partie supplémentaire de l'URL. Dans votre cas, je pense que vous pourriez utiliser :

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Cependant, si votre application contient des liens internes, ils peuvent toujours pointer vers /abc/foo , et si vous faites cela, ils doivent pointer vers /route/abc/foo pour que la requête brute arrive correctement. Il est préférable de laisser la configuration de nginx telle quelle et de configurer votre application pour qu'elle sache qu'elle se trouve dans un sous-répertoire, si vous le pouvez.

Je sais que c'est une vieille question, mais c'est ce qui est apparu en premier sur Google lorsque j'ai essayé de résoudre le même problème.

0 votes

Merci ! dans ce lien on peut revoir la liste des variables : wiki.nginx.org/HttpProxyModule#Variables

0 votes

Cette réponse est meilleure que les autres

29voto

ALex_hha Points 6885

Essayez ce qui suit

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

0 votes

Cette solution a été la plus efficace pour moi, car elle préserve le nom d'hôte.

0 votes

Propre et simple.

13voto

rufreakde Points 101

Vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }
}

Ce code écoute sur 8080 et redirige vers le port 8787 sur compute-1-36. Vous pouvez sélectionner un autre chemin dans l'emplacement /

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X