Apache ProxyPass pour les URL échouant de manière incohérente

Celui-ci me rend fou. J’ai un serveur proxy Apache actif et en service servant du contenu sur EC2. Il fonctionne très bien et dispose de nombreux hôtes virtuels configurés comme suit:

 ServerName m.FOO.com ServerAlias customer.FOO.com ProxyPreserveHost On ProxyPass / ajp://10.211.42.48:8009/ ProxyPassReverse / ajp://10.211.42.48:8009/  Order allow,deny Allow from all   

Tout fonctionne très bien et je n’ai aucun problème. Maintenant, ce que je voudrais faire, c’est le déplacer. Au lieu d’un seul hôte pour chaque application, je veux avoir une sous-URL sur le site principal qui renvoie au serveur d’applications. Ainsi, au lieu d’avoir un client “customer.FOO.com”, ils auront “FOO.com/customer/”

Super, ça sonne facile, non? Oui, pas tellement. Je modifie l’entrée vhost pour ‘root’ du serveur (affichant actuellement la page de destination), et ajoute les entrées de proxy aux répertoires de ce serveur. Cela devrait le faire, non? Oui, ce n’est pas:

  ServerName web01.aws.FOO.com DocumentRoot /var/www/html ErrorLog logs/www.FOO.com-error_log CustomLog logs/www.FOO.com-access_log common  ProxyPass ajp://10.211.42.48:8009 ProxyPassReverse ajp://10.211.42.48:8009   ProxyPass http://adm01 ProxyPassReverse http://adm01   Order allow,deny Allow from all   

Si je frappe http://www.FOO.com/t/ – j’obtiens le serveur Web interne – il envoie les proxys correctement, et tout va bien. Si je frappe http://www.FOO.com/a/, je reçois une erreur 404. Le journal d’access affiche même une erreur 404.

Notez que les entrées AJP de ProxyPass sont identiques à celles de l’autre entrée vhost. Alors, pourquoi cela fonctionne-t-il sur la racine de l’autre entrée de vhost, et pas comme un sous-répertoire sur le vhost principal?

Halp!

J’ai fini par résoudre ce problème avec un indice particulier que j’ai trouvé sur une liste de diffusion quelque part. La directive ProxyPassReverse est très délicate et possède une fonction de base. Tout ce qu’il correspond au second argument (en supposant que vous utilisez le formulaire ProxyPassReverse AB) sera appliqué au premier argument. Il est donc essentiel de s’assurer que le deuxième argument est exactement la redirection provenant de votre application, sinon la directive ProxyPassReverse sera ignorée.

Dans mon cas, ce que j’ai fini par faire était de modifier l’entrée Location pour:

 ProxyPass /a/ ajp://10.211.42.48:8009 ProxyPassReverse /a/ http://my.apphost.com/ 

Et tout a bien fonctionné.