Nginx: Wie leite ich eine http-Anfrage an einen anderen Port weiter?

65

Was ich tun möchte, ist,

Wenn jemand http://localhost/route/abcden Server besucht, verhält es sich genauso wiehttp://localhost:9000/abc

Jetzt konfiguriere ich mein Nginx so:

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

Die http-Anforderung wird 9000ordnungsgemäß an den Port gesendet, der empfangene Pfad jedoch http://localhost:9000/route/abcnicht http://localhost:9000/abc.

Irgendein Vorschlag ?

Mrroy
quelle

Antworten:

65

Ich hasse die Subtilität hier, aber versuche, ein / am Ende von 9000 wie unten hinzuzufügen. Es wird jetzt keine "Route" mehr an die weitergeleitete Anfrage angehängt.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
Hai
quelle
4
Dies sollte die akzeptierte Antwort sein. /Das einfache Hinzufügen ist gut dokumentiert, um das am Speicherort aufgeführte Präfix zu entfernen.
Bernard
40

Ich glaube, Sie können das Umschreiben verwenden, um den zusätzlichen Teil der URL zu entfernen. In Ihrem Fall, denke ich, könnten Sie Folgendes verwenden:

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

Wenn Ihre App jedoch interne Links enthält, verweisen diese möglicherweise weiterhin auf / abc / foo. Wenn Sie dies tun, müssen Sie stattdessen auf / route / abc / foo verweisen, damit die unformatierte Anforderung korrekt eingeht. Möglicherweise ist es besser, die nginx-Konfiguration so zu belassen, wie sie ist, und stattdessen die App so zu konfigurieren, dass sie sich in einem Unterverzeichnis befindet, sofern dies möglich ist.

Ich weiß, dass dies eine alte Frage ist, aber es war der Top-Google-Hit für mich, als ich versuchte, das gleiche Problem zu lösen!

user2428107
quelle
Vielen Dank ! In diesem Link können wir die Liste der Variablen überprüfen
Edgard Leal
17

Versuche Folgendes

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
quelle
Diese Lösung hat sich am besten für mich bewährt, da der Hostname beibehalten wird.
Shafique Jamal
Sauber und einfach.
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/;
    }
  }

Dieser Code überwacht 8080 und leitet auf compute-1-36 zu Port 8787 weiter. Sie können einen anderen Pfad in Position / auswählen.

user3266656
quelle