[Linuxtrent] Re: Due reti con lo stesso nome e web server

  • From: Lorenzo Cappelletti <l_cappelletti@xxxxxxxxxxxx>
  • To: LinuxTrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: Mon, 12 Apr 2004 14:02:56 +0200

Mi rispondo da solo, visto che credo di aver trovato la soluzione.  Anzi 
più di una.

IL CASO

Incominciamo riassumendo il problema (in modo, spero, più chiaro).  In 
ufficio ho un piccolo server web connesso alla rete interna che risponde 
all'URL www.ditta.com(192.168.1.x).  Su questo serve sono presenti 
alcune pagine e dovrebbe essere, dal punto di vista dell'impiegato, il 
punto di riferimento.

La ditta ha anche un proprio sito gestito da terzi che risponde all'URL 
www.ditta.com(11.22.33.44).  Notare che il nome di dominio è lo stesso, 
ma l'indirizzo IP è diverso.  Il sito è in virtual host su 
web.hosting.com(11.22.33.44).


L'OBIETTIVO

L'obiettivo è avere una sottodirectory www.ditta.com(192.168.1.x)/site/
che visualizzi il sito www.ditta.com(11.22.33.44).


IL PROBLEMA

Il problema principale è che c'è un conflitto nei nomi.  Ci sono infatti 
due serve con lo stesso nome di dominio, ma con due indirizzi IP 
differenti.


SOLUZIONE 1

La prima soluzione è semplice quanto scomoda: fare una copia mirror del
sito.  È scomoda perché il sito non è aggiornato automaticamente.  Ma è
semplice: basta infatti appoggiarsi ad un proxy pubblico esterno
(<http://www.publicproxsyservers.com/>, mi sembra) per avere l'indirizzo
www.ditta.com risolto come 11.22.33.44 per fare il mirror del sito:

http_proxy="http://55.66.77.88:8080/"; wget --mirror http://www.ditta.com/


SOLUZIONE 2

Il server Apache in uso (ver. 1.3.x) possiede delle capacità di proxy. 
Sfruttando ancora il trucco di chiedere la pagina ad un proxy esterno, è
possibile avere le pagine aggiornate in tempo reale sotto la directory
/site/ come desiderato.  È necessario, però, che i link contenuti
all'interno della pagina siano riscritti da /path/to/page.html a
/site/path/to/page.html (il sito gestito da terzi ha, infatti, dei link
assoluti, sobh!).  Per questo è necessario il modulo mod_proxy_html
disponibile solo con Apache 2.x.

=== /etc/apache/httpd.conf =============================================
# Requests are force to go through the proxy module below
RewriteEngine On
RewriteRule ^/site/?(.*) http://www.ditta.com/$1 [P]

ProxyRequests On
ProxyVia On
# http://www.publicproxyservers.com/
ProxyRemote http://www.ditta.com/ http://217.58.160.194:3128   
========================================================================


SOLUZIONE 3

Il fatto di avere Apache 1.3.x e di non poter riscrivere i link relativi
contenuti all'interno delle pagine, cosa che mi sembra anche pesante e
macchinosa, nonostante sia raro che una ditta voglia visitare il proprio
sito (vi capita mai di telefonarvi?), mi ha fatto propendere per 
un'altra soluzione: invece di porre tutto sotto una directory 
www.ditta.com(192.168.1.x)/site/, avere un mio host virtuale 
site.ditta.com(192.168.1.x).

=== /etc/apache/httpd.conf =============================================
# Catch-all vhost
<VirtualHost *>
    ServerName www.ditta.com
    ServerAlias ditta.com
</VirtualHost>

<VirtualHost *>
    ServerName site.ditta.com

    # Requests are force to go through the proxy module below
    RewriteEngine On
    RewriteRule ^/?(.*) http://www.ditta.com/$1 [P]

    ProxyRequests On
    ProxyVia On     
    # http://www.publicproxyservers.com/
    ProxyRemote http://www.ditta.com/ http://217.58.160.194:3128

</VirtualHost>
========================================================================



SOLUZIONE 4

Ma a questo punto, perché far funzionare un server web come proxy, visto 
che un proxy installato ce l'ho già (leggi Squid)?  In questo modo evito 
anche di dovermi appoggiare ad un proxy pubblico esterno.

Quest'ultima soluzione (che è quella che alla fine ho addottato), mi è
venuta in mente perché ho compreso (dalle pagine di documentazione di
Apache) come funziona la virtualizzazione di un host.  In parole povere,
quando una richiesta viene spedita al server web.hosting.com , ma
l'header della richiesta HTTP contiene il campo "Host: www.ditta.com",
il server capisce che la pagina richiesta deve essere presa dallo spazio
dell'host virtualizzato www.ditta.com.

Con le ACL di squid ed i comandi header_access e header_replace e
possibile modificare/aggiungere il campo "Host:" da "site.ditta.com"
(valore impostato dal browser dell'utente) a "www.ditta.com".  Ed il 
gioco è fatto.

=== /etc/bind/db.ditta.com =============================================
site            CNAME   web.hosting.com.
========================================================================

=== /etc/squid.conf ====================================================
acl local-servers dstdomain .ditta.com
acl local-external dst site.ditta.com
always_direct deny local-external
always_direct allow local-servers

header_access Host deny local-external
header_replace Host www.ditta.com
========================================================================


Spero di aver fatto cosa gradita a riassumere qui le mie considerazioni 
e soluzioni.

-- 
email: lorenzo.cappelletti@xxxxxxxx
Jabber: lolo@xxxxxxxx
Fingerprint: 8CDD 3408 53B2 6122 99DA EE37 1523 68FC D906 4C08
--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: