Réécrire les urls dans un reverse-proxy apache

Apache nous propose un mode reverse-proxy qui nous permet de rediriger les requêtes entrantes vers un site distant. Cela nous permet d’embarquer un site internet dans le nôtre. Mais qu’en est-il pour les liens renvoyés par le site distant? Si le site nous envoie des urls avec un chemin relatif, cela ne fonctionnera pas dans notre reverse-proxy.

Nous verrons ici comment mettre en place le reverse-proxy dans apache puis comment réécrire les urls afin de pouvoir embarquer le css et les scripts du site distant.

 Activer le reverse proxy

Les modules à charger

Il faut commencer par charger les bons modules. Pour cela dans la configuration apache il faut que les lignes suivantes soient présentes

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_module modules/mod_proxy.so

Rediriger les requêtes vers le site distant

Pour rediriger les requêtes il faut encore une fois modifier la configuration apache. Prenons comme exemple la page de login de notre webmail. Après avoir installé un serveur apache sur mon poste je veux rediriger tout ce qui arrive sur /webmail vers notre site. J’utilise donc la configuration

#On desactive le proxy standard
ProxyRequests off
#On defini le chemin local et le site distant
ProxyPass /webmail http://webmail.alinto.net/wm
ProxyPassReverse /webmail http://webmail.alinto.net/wm
#Pour le chemin local on ne fait rien de particulier
<Location /webmail\>
     ProxyPassReverse /
</Location>

Avec cette configuration on obtient le résultat suivant

C’est à dire notre page de login mais sans aucun style.

En effet après un rapide coup d’œil à la page de login on constate que le css est appelé ainsi

/wm/medias/login/style.css

Il nous faudra donc réécrire l’url plus tard pour que notre site local puisse y accéder via le reverse-proxy.

Réécrire les urls dans le reverse-proxy

Pour réécrire les urls nous aurons besoin d’un nouveau module qui est le module proxy html ainsi que du module xml2enc. Nous ajoutons donc à notre configuration apache

LoadFile /usr/lib64/libxml2.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so

Qu’il faut bien entendu adapté à votre installation.

Le reste se passe dans notre fichier de configuration spécifique à notre reverse-proxy.Nous commençons par indiquer pour quels éléments nous souhaitons faire la réécriture des urls. Ici nous avons choisi de remplacer dans beaucoup de contexte, de façon à ne rien oublier.

ProxyHTMLLinks a href
ProxyHTMLLinks area href
ProxyHTMLLinks link href
ProxyHTMLLinks img src longdesc usemap
ProxyHTMLLinks object classid codebase data usemap
ProxyHTMLLinks q cite
ProxyHTMLLinks blockquote cite
ProxyHTMLLinks ins cite
ProxyHTMLLinks del cite
ProxyHTMLLinks form action
ProxyHTMLLinks input src usemap
ProxyHTMLLinks head profile
ProxyHTMLLinks base href
ProxyHTMLLinks script src for
ProxyHTMLLinks iframe src

Ensuite il faut effectuer la réécriture des urls.

<Location /webmail>
 ProxyPassReverse /
#On active la réécriture d'urls
ProxyHTMLEnable OnProxyHTMLExtended On&nbsp;
ProxyHTMLURLMap /webmail/ /webmail/ L
ProxyHTMLURLMap ^/wm/(.*)$ /webmail/$1 R
RequestHeader unset Accept-Encoding
</Location>

On peut s’apercevoir qu’on va donc remplacer dans les urls renvoyées par le site distant tout ce qui commence par /wm/ par /webmail/. Le R nous permet d’indiquer que l’on veut utiliser les expressions régulières et nous permet de capturer la partie droite de l’url pour la remettre ensuite. Le premier remplacement qui est fait nous permet de remplacer simplement /webmail/ par /webmail/, cela peut sembler inutile mais ici l’important est le L car il permet d’arrêter le remplacement lorsque cette chaîne correspond. Enfin, la dernière ligne nous permet de ne pas recevoir de contenu compressé du site distant, si le contenu est compressé nous ne pouvons pas faire les substitutions.

Nous obtenons donc le résultat suivant

Ce qui correspond à notre formulaire initial. Nous avons donc, en remplaçant les urls d’appel des scripts css, permis à notre reverse-proxy d’y accéder de nouveau.

Nous vous avons donc montré comment mettre en place un reverse-proxy dans apache et comment réécrire les urls dans les pages renvoyées par le site distant. Maintenant c’est à vous de jouer.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *