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 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.