Proxy inverso: rimuove la sottodirectory


27

Nel prossimo futuro avrò 3 server nginx. Uno è un proxy inverso per SSL per gli altri due. Quindi, per esempio, vado a:

https://www.mysitename.com/site1

Gli altri due server in questo esempio sono site1 e site2. Ho installato il certificato SSL sul proxy e voglio usare un proxy inverso (SSL non richiesto poiché tutti e 3 sono su una rete interna). A scopo di test sto avendo nginx in ascolto su 443 per SSL / reverse-proxy, in ascolto su porta 8081 che è un'app di binari per site1 e 8082 per site2.

Ho questo...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

Quindi, quando visito il sito www.mysitename.com/site1, voglio sostanzialmente che ritorni ciò che normalmente verrebbe da localhost: 8081 (o più tardi un indirizzo IP interno per un altro server).

C'è un modo per spogliarlo "site1" dalla chiamata localhost? Quello che sembra fare sta usando localhost: 8081 / site1. I siti site1 e site2 sono della natura "/ login / index" o "/ qualunque / elenco", ecc., Senza "site1".

Ci sono anche reindirizzamenti nei controller del sito (usando redirect_to) che vanno da cose come / login / index a / qualunque / elenco.

Devo ridisegnare gli URL del sito per utilizzare site1? O il proxy NGINX può capirlo?

Grazie.


Per Socket.io prova questo basta aggiungere rewrite /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Risposte:


53

Citando http://nginx.org/r/proxy_pass :

Se proxy_pass viene specificato con URI, quando si passa una richiesta al server, parte di un URI di richiesta normalizzato corrispondente alla posizione viene sostituito da un URI specificato nella direttiva:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Cioè, devi usare in proxy_passquesto modo:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

Nota la parte finale /della proxy_passdirettiva: sostituirà parte dell'URI originale corrispondente alla posizione, ad es /site1/.


2
È bastata una barra finale per risolvere il problema !? Grazie per quello Ora per capire come gestirò redirect_to - ma questa non è una domanda del server, quindi lo capirò altrove.
Chromag

nota, è necessaria anche la barra finale sull'URL proxy_pass!
Daniel Hill,
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.