Configuration Apache : du bon usage de RedirectMatch et de mod_proxy
La configuration d'un serveur HTTP d'Apache est une source d'occupation sans limite tellement les possibilités d'utilisation sont nombreuses. Ma casquette de développeur et intégrateur LemonLDAP::NG m'amène souvent à les explorer.
Dernière découverte en date, l'utilisation conjointe de RedirectMatch et mod_proxy.
RedirectMatch
La clause RedirectMatch permet de faire des redirections basées sur une expression régulière. Le cas d'utilisation le plus classique quand on fait un proxy vers une application hébergée dans un serveur JEE est de rediriger la racine / vers le répertoire de l'application /appli/ :
RedirectMatch ^/$ /appli/
mod_proxy
Le module mod_proxy permet de passer les requêtes à un autre serveur, au hasard un serveur JEE :
ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
Cohabitation
Si vous mettez les deux configurations présentées ci-dessus ensemble, la redirection vers /appli/ ne fonctionnera plus. Alors qu'elle fonctionne sans mod_proxy.
Et c'est parti pour quelques heures de doute sur la condition humaine, jusqu'à ce qu'une recherche sur internet vous amène sur cet article.
La clé du mystère est que quand ProxyPass est configuré sur "/", cette clause prévaut sur les autres, et donc la requête est transmise avant que la redirection ne soit effectuée.
La solution est donc de limiter le champ d'action du proxy :
RedirectMatch ^/$ /appli/ ProxyPass /appli/ http://localhost:8080/appli/ ProxyPassReverse /appli/ http://localhost:8080/appli/
En espérant que cela vous fera gagner du temps ;)