Nginx: come inoltro una richiesta http a un'altra porta?


65

Quello che voglio fare è

Quando qualcuno visita http://localhost/route/abcla risposta del server esattamente comehttp://localhost:9000/abc

Ora configuro il mio Nginx in questo modo:

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

La richiesta http viene spedita 9000correttamente, ma il percorso ricevuto http://localhost:9000/route/abcnon lo è http://localhost:9000/abc.

Qualche suggerimento ?

Risposte:


65

Odio la sottigliezza qui, ma prova ad aggiungere un / alla fine di 9000 come sotto. Ora non aggiungerà più "route" alla richiesta inoltrata.

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

4
Questa dovrebbe essere la risposta accettata. La semplice aggiunta /è ben documentata come il modo per rimuovere il prefisso elencato nella posizione.
— Bernard,

40

Ritengo che tu possa utilizzare la riscrittura per rimuovere la parte aggiuntiva dell'URL. Nel tuo caso penso che potresti usare:

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

Tuttavia, se la tua app contiene collegamenti interni, potrebbe comunque puntare a / abc / foo, e in questo caso dovrà invece puntare a / route / abc / foo in modo che la richiesta non elaborata arrivi correttamente. Potrebbe essere meglio lasciare la configurazione di nginx così com'è e invece configurare l'app per essere consapevole che vive in una sottodirectory, se puoi.

So che questa è una vecchia domanda, ma è stata la migliore hit di Google per me quando stavo cercando di risolvere lo stesso problema!


Grazie ! in questo link possiamo rivedere l'elenco delle variabili: wiki.nginx.org/HttpProxyModule#Variables
— Edgard Leal

17

Prova quanto segue

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

Questa soluzione ha funzionato meglio per me, poiché conserva il nome host.
— Shafique Jamal,

Pulito e semplice.
— 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/;
    }
  }

Questo codice è in ascolto su 8080 e reindirizza alla porta 8787 sul calcolo 1-36. Puoi selezionare un altro percorso nella posizione /

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.