Nginx: Comment transférer une demande http vers un autre port?

65

Ce que je veux faire, c'est

Quand quelqu'un visite http://localhost/route/abcla réponse du serveur exactement la même chose quehttp://localhost:9000/abc

Maintenant, je configure mon Nginx comme ceci:

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

La requête http est 9000correctement distribuée sur le port , mais le chemin qu’elle a reçu http://localhost:9000/route/abcne l’ est pas http://localhost:9000/abc.

Toute suggestion ?

MrROY
la source

Réponses:

65

Je déteste la subtilité ici, mais essayez d'ajouter un / à la fin de 9000 comme ci-dessous. Il n’ajoutera plus «route» à la demande transférée maintenant.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
Requin
la source
4
Cela devrait être la réponse acceptée. L'ajout /est bien documenté comme moyen de supprimer le préfixe indiqué dans l'emplacement.
Bernard
40

Je crois que vous pouvez utiliser rewrite 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;
}

Toutefois, si votre application contient des liens internes, ceux-ci peuvent toujours pointer vers / abc / foo. Si vous faites cela, ils doivent plutôt pointer vers / route / abc / foo pour que la requête brute arrive correctement. Vous feriez peut-être mieux de laisser la configuration nginx en l'état et de configurer votre application pour qu'elle sache qu'elle réside dans un sous-répertoire, si vous le pouvez.

Je sais que c’est une vieille question, mais c’était la meilleure frappe de Google pour moi lorsque j’essayais de résoudre le même problème!

utilisateur2428107
la source
Merci ! dans ce lien, nous pouvons consulter la liste des variables: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal
17

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;
}
ALex_hha
la source
Cette solution a fonctionné au mieux pour moi, car elle préserve le nom d'hôte.
Shafique Jamal
Propre et simple.
Ravshan Samandarov
7

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 /

utilisateur3266656
la source