On 23/02/2011 1:17, Marco Ciampa <ciampix@xxxxxxxxx> wrote:
Sto usando joomla 1.6. Il server su cui gira ha un ip interno [...] L'unico server web accessibile dall'esterno usa le direttive ProxyPass e ProxyPassReverse per accedere a tale sito interno. Purtroppo appena carico una pagina, questa la vedo costruita con l'ip interno della macchina e non con il nome della macchina dato dalla variabile ServerName di Apache2 [...]
Ci ho sbattuto il naso anch'io qualche giorno fa... la natura del problema è ovviamente ovvia, come tutte le cose ovvie dopo che ci arrivi. Prima un po' meno. :)
La differenza tra un redirect a livello di TCP/IP sul firewall (DNAT) ed un proxy è che nel primo caso la richiesta arriva inalterata e mantiene l'IP sorgente originale, mentre nel secondo caso la richiesta viene processata dal proxy ed arriva al server dall'IP interno del proxy. Nel caso di un proxy HTTP con ProxyPass, *il proxy riscrive anche l'header HTTP*! Questo è il dettaglio ovvio che mi ero perso...
Quindi se tu hai: * 192.168.x.x: server vero sulla rete interna * 192.168.x.y: indirizzo interno del proxy * 1.2.3.4: indirizzo esterno del proxy * foo.example.com: DNS assegnato all'indirizzo esterno * ProxyPass / http://192.168.x.x/...l'applicazione che genera pagine contenenti il nome pescato dall'header avrà problemi perché l'header HTTP che arriva al server interno contiene 192.168.x.x, non foo.example.com; ProxyPassReverse non aiuta in questo caso, perché aggiusta gli header in uscita, non certo il contenuto delle pagine.
La soluzione più naturale è aggiustare tutte le pagine sul server interno in modo che usino URL relativi, ma ciò può essere complicato o impossibile quando ci sono di mezzo applicazioni che non prevedono un meccanismo per adattarsi a situazioni di questo tipo, come spiegavi nelle mail successive.
La soluzione che ho trovato (e non sono sicuro che sia l'unica, né la migliore) è mettere nel file /etc/hosts del proxy una riga che associa a foo.example.com all'IP interno del server:
192.168.x.x foo.example.com ...ed aggiustare la direttiva ProxyPass per usare il nome: ProxyPass / http://foo.example.com/Quindi foo.example.com punta a 1.2.3.4 per chi sta all'esterno, mentre per il proxy punta a 192.168.x.x; in questo modo l'header arriva al proxy interno con lo stesso nome usato dal client esterno.
Ovviamente tutto ciò funziona solo se stai proxegiando l'intero sito (generalmente all'interno di un NameVirtualHost); se vuoi "incollare" l'applicazione interna in una subdirectory del sito visibile dall'esterno, bisogna inventarsi qualcos'altro.
-- Ciao, Flavio -- Per iscriversi (o disiscriversi), basta spedire un messaggio con OGGETTO "subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx