Nginx: Jak przekazać żądanie HTTP do innego portu?


65

Chcę to zrobić,

Gdy ktoś odwiedza http://localhost/route/abcodpowiedź serwera dokładnie tak samo jakhttp://localhost:9000/abc

Teraz konfiguruję Nginx w następujący sposób:

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

Żądanie HTTP jest wysyłane 9000poprawnie do portu , ale ścieżka do niego http://localhost:9000/route/abcnie jest http://localhost:9000/abc.

Jakieś sugestie ?

Odpowiedzi:


65

Nienawidzę tutaj subtelności, ale spróbuj dodać / na końcu 9000 jak poniżej. Nie będzie już teraz dołączać „trasy” do przesłanego żądania.

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

4
To powinna być zaakceptowana odpowiedź. Samo dodanie /jest dobrze udokumentowane jako sposób na usunięcie prefiksu wymienionego w lokalizacji.
Bernard,

40

Uważam, że możesz użyć przepisania, aby usunąć dodatkową część adresu URL. W twoim przypadku myślę, że możesz użyć:

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

Jeśli jednak aplikacja zawiera linki wewnętrzne, mogą nadal wskazywać na / abc / foo, a jeśli to zrobisz, zamiast tego muszą wskazać / route / abc / foo, aby nieprzetworzone żądanie zostało poprawnie przesłane. Być może lepiej zostawić konfigurację nginx taką, jaka jest, i zamiast tego konfigurować aplikację, aby była świadoma, że ​​mieszka w podkatalogu, jeśli możesz.

Wiem, że to stare pytanie, ale było to dla mnie hit Google, gdy próbowałem rozwiązać ten sam problem!


Dzięki ! w tym linku możemy przejrzeć listę zmiennych: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal

17

Spróbuj wykonać następujące czynności

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

To rozwiązanie działało dla mnie najlepiej, ponieważ zachowuje nazwę hosta.
Shafique Jamal

Czysty i prosty.
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/;
    }
  }

Ten kod nasłuchuje na 8080 i przekierowuje do portu 8787 na compute-1-36. Możesz wybrać inną ścieżkę w lokalizacji /

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.