2016-01-08 32 views
15

Ho due applicazioni Web (app express.js node.js), web1 e web2. Queste app Web si aspettano di essere ospitate su siti che sono tipicamente qualcosa come http://www.web1.com e http://www.web2.com. Mi piacerebbe ospitarli dietro un reverse proxy nginx come https://www.example.com/web1 e https://www.example.com/web2. Non voglio esporre le due app Web come due sottodomini su example.com.Come servire due applicazioni Web dietro un proxy inverso nginx

Ecco un frammento della mia configurazione nginx (senza SSL dettagli di terminazione) che avevo sperato sarebbe raggiungere questo obiettivo:

server { 
    listen 443; 
    server_name .example.com; 

    location /web1 { 
    proxy_pass http://www.web1.com:80; 
    } 

    location /web2 { 
    proxy_pass http://www.web2.com:80; 
    } 
} 

Questo funziona, fatta eccezione per i collegamenti relativi che le applicazioni web utilizzano. Quindi l'applicazione web web1 avrà un collegamento relativo come /js/script.js che non verrà gestito correttamente.

Qual è il modo migliore/standard per eseguire questa operazione?

+0

Non so ngix, ma nella richiesta web c'è il referrer http che è la pagina "precedente" alla richiesta corrente. Puoi mappare il referrer in ngix? – bdn02

+0

Ho visto alcuni luoghi che vedono questa come una potenziale soluzione, ma non sono sicuro di come questo potrebbe essere implementato. – Erik

+0

guarda questo: http://serverfault.com/questions/177304/different-nginx-rules-based-on-referrer – bdn02

risposta

3

penso che qualcosa di simile: server { listen 443; server_name .example.com; location /web1 { proxy_pass http://www.web1.com:80 ; } location /web2 { proxy_pass http://www.web2.com:80 ; } location/{ if ($http_referer ~* (/web1)) { proxy_pass http://www.web1.com:80 ; } if ($http_referer ~* (/web2)) { proxy_pass http://www.web2.com:80 ; } } }

+0

Questo sembra abbastanza buono. Qualche possibilità di sapere in che cosa deve essere impostato l'header referer in express? – Erik

3

si dovrebbe essere in grado di fare questo controllando il $http_referer, qualcosa come:

location/{ 
    if ($http_referer ~ ^http://(www.)?example.com/web1) { 
    proxy_pass http://www.web1.com:80; 
    } 

    if ($http_referer ~ ^http://(www.)?example.com/web2) { 
    proxy_pass http://www.web2.com:80; 
    } 
} 

Il browser sarebbe l'impostazione del referer per http://example.com/web1/some/page quando richiede /js/script.js in modo che le app non debbano essere modificate, a meno che non debbano elaborare o curare internamente il referente.

Il $ HTTP_REFERER non sembra essere facile da trovare in documenti nginx, ma è menzionato in alcuni siti:

1

Come sull'utilizzo dei cookie e ngx_http_map_module ?

Aggiungi add_header Set-Cookie "site=web1;Path=/;Domain=.example.com;"; a location /web1 {...} (anche Web2).

Aggiungi map di sotto http

map $cookie_site $site { 
    default http://www.web1.com:80; 
    "web2" http://www.web2.com:80; 
} 

posizione predefinita è questo

location/{ 
    proxy_pass $site; 
} 

È possibile passare il valore del cookie per proxy_pass direttamente. Ma usare la mappa è un modo più sicuro.

Problemi correlati