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 ?

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

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!


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

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 /

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.