2014-07-08 10 views
5

Il mio titolo non è il migliore, la mia conoscenza del webstuff è piuttosto semplice, mi spiace.Il server dietro il proxy inverso di nginx ignora il percorso relativo nell'URL

Quello che voglio raggiungere

Ho una scatola fanbox esecuzione nginx su Archlinux che uso come punto di ingresso principale alla mia LAN domestica da Internet (vale a dire lavorare dove posso solo uscire alla porta 80 e 443) tramite la funzione di proxy inverso utilizzando un nome di dominio mutevole su cui non ho alcun controllo e che chiameremo per ora home.net.

fanbox ha le porte 80 e 443 mappati a home.net, quella parte era facile.

Ho 2 server web dietro il firewall, web1.lan, web2.lan, web2ilo.lan. Entrambi questi hanno diverse applicazioni (che può avere lo stesso nome su macchine diverse) che possono direttamente accedere sulla LAN tramite URL standard (i nomi sono dati come esempi, non ho alcun controllo sul contenuto):

http://web1.lan/phpAdmin/ 
http://web1.lan/gallery/ 
http://web2.lan/phpAdmin/ 
http://web2.lan/dlna/ 

... e così via ...

Ora web2ilo.lan è un caso particolare. È l'interfaccia web di gestione fuori banda del server HP web2.lan. Quel particolare server web offre solo 1 applicazione, in modo che possa essere accessibile solo tramite il suo URL radice:

http://web2ilo/login.html 

Il mio obiettivo è quello di questi sono disponibili sottotracciato di home.net come questo:

http://home.net/web1/phpAdmin/ 
http://home.net/web1/gallery/ 
http://home.net/web2/phpAdmin/ 
http://home.net/web2/dlna/ 
http://home.net/web2ilo/login.html 

il mio problema

che quasi funziona, ma le applicazioni web tendono a riscrivere gli URL in modo che dopo accedo a rispettivamente:

http://home.net/web1/phpAdmin/login.php 
http://home.net/web2ilo/login.html 

il browser viene reindirizzato rispettivamente

http://home.net/phpAdmin/index.php 
http://home.net/index.html 

Nota che i sottotracciati relativi web1 e web2ilo sono andati, che logicamente mi danno un 404.

mio config

Così lontano, ho cercato molto e ho provato molte opzioni in nginx senza capire troppo quello che stavo facendo. Ecco la mia configurazione che riproduce questo problema. Ho lasciato SSL per chiarezza.

server { 
     listen  443 ssl; 
     server_name localhost; 

     # SSL stuff left out for clarity 

     location/{ 
      root /usr/share/nginx/html; 
      index index.html index.htm; 
     } 

     location /web1/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web1.lan/; 
     } 


     location /web2/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web2.lan/; 
     } 

     location /web2ilo/ { 
       proxy_set_header Host $host; 
       proxy_redirect off; 
       proxy_pass https://web2ilo.lan/; 
     } 

    } 

Dopo le prime risposte

Dopo il primo paio di risposte (grazie!), Mi rendo conto che la mia messa a punto è tutt'altro che comune e che io possa essere in direzione di guai da solo.

Quale sarebbe quindi un'idea migliore per accedere al server Web dietro il firewall senza toccare le porte di frontend e il dominio/nome host?

+0

È esplicitamente disable url rewriting con 'proxy_redirect off' e si aspettano di lavorare. Divertente. –

+2

Ho seguito degli esempi che ho trovato su google ... Ho provato diversi parametri per questa opzione ma non riesco a notare alcuna differenza. Quindi immagino che tutto il mio approccio sia totalmente sbagliato. Non divertente no. – FLBzh

risposta

1

È possibile prendere in considerazione l'uso dell'impostazione proxy_redirect per consentire a nginx di conoscere le intestazioni di risposta del server "back-end" (Posizione e aggiornamento) agli URL front-end appropriati. È possibile utilizzare l'impostazione default per consentire nginx per calcolare i valori appropriati dalle vostre location e proxy_pass direttive, o specificare esplicitamente le mappature come di seguito:

proxy_redirect http://web1.lan/ /web1/ 

See: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Nota: Questo solo influenza le intestazioni di risposta - non tutti i collegamenti nel contenuto HTML o Javascript.

In caso di problemi con i collegamenti nel contenuto o Javascript, è possibile modificare il contenuto sui server di back-end (che potrebbe essere indicato potrebbe non essere possibile) o regolare la soluzione proxy in modo tale che i percorsi front-end siano gli stessi come quelli back end (ad esempio, piuttosto che http://frontend/web1/phpAdmin hai semplicemente http://frontend/phpAdmin). Ciò comporterebbe l'aggiunta location direttive per ogni applicazione, ad esempio,

location /phpAdmin/ { 
    proxy_set_header Host $host; 
    proxy_redirect off; 
    proxy_pass https://web1.lan/phpAdmin/; 
}   
+0

Punto 1: ho provato entrambi, ma non abbastanza per notare alcuna differenza. Leggerò il documento e farò dei test. – FLBzh

+0

Punto 2: Sembra buono ma non copre un caso particolare che non ho menzionato nella mia domanda ... Non pensavo che sarebbe stato necessario. Io modifico – FLBzh