Le module mod_proxy d'Apache permet de rendre visible des serveurs Web d'un réseau privé aux clients d'un autre réseau (publique par exemple).
La situation classique est d'avoir un serveur A dans une DMZ et un serveur B dans un réseau privé ; un client venant d'Internet (par exemple) ne pourra pas voir le serveur B et devra passer par A (qui fera office de proxy) pour voir le contenu de B.
Client ------ Serveur A ------ Serveur B
Cas où le serveur A peut avoir plusieurs enregistrements DNS
Dans ce cas, le serveur A portera 2 noms différents (configuré sur la même IP) et renverra le contenu associé aux noms.
Par exemple : * l'adresse IP de A est 123.456.789.123 * l'adresse IP de B est 192.168.0.1 * 2 noms pointent sur cette adresse : a.exemple.org et b.exemple.org
Si le client demande le contenu de a.exemple.org alors le serveur A renverra le contenu local, si le client demande le contenu de b.exemple.org alors le serveur A servira de proxy et renverra le contenu fournit par B.
Configuration du serveur A
La différenciation se fait sur la directive ServerName. On déclare des hôte virtuel sur l'IP du serveur A, et pour chaque hôte on associe un ServerName différent. Les ServerName doivent être de vrais noms renseigné dans le DNS, avec lesquels un client peut se connecter sur le sevreur A.
NameVirtualHost 123.456.789.123:80
<VirtualHost 123.456.789.123:80>
ServerName a.exemple.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost 123.456.789.123:80>
ServerName b.exemple.org
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass / http://192.168.0.1/
ProxyPassReverse / http://192.168.0.1/
<Proxy *>
Order Deny,Allow
Allow from all
</Proxy>
</VirtualHost>
Cas où l'on ne souhaite rediriger qu'une partie de l'URL
Dans ce cas l'ensemble du contenu de B sera visible par une URL spéciale, dédié à B, par exemple a.exemple.org/b.
Dans notre exemple : * l'adresse IP de A est 123.456.789.123 * l'adresse IP de B est 192.168.0.1
Configuration du serveur A
NameVirtualHost 123.456.789.123:80
<VirtualHost 123.456.789.123:80>
ServerName a.exemple.org
ServerAdmin webmaster@localhost
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
# Suppresses the Via header
ProxyVia Off
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /b/ http://192.168.0.1/
ProxyPassReverse /b/ http://192.168.0.1/
</VirtualHost>