Tomcat derrière Apache httpd – ignorant RewriteRule?

J'ai une configuration assez commune d'un server d'applications Tomcat derrière apache httpd utilisant mod_proxy. Mon hôte virtuel ressemble à ceci:

<VirtualHost test.example.be:80> ServerName test.example.be RewriteEngine on RewriteRule ^/test/(.*)$ /$1 ProxyRequests Off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:8181/test/ ProxyPassReverse / http://localhost:8181/test/ </VirtualHost> 

L'application déployée dans Tomcat, «test», utilise une structure (security de spring) qui est contextuelle et prépare ainsi la racine contextuelle lors de la redirection. Donc, quand il redirige vers une page appelée foo.html qui est située dans la racine, elle redirige vers bleh: //test.example.com/test/foo.html. Cette URL n'existe pas et donne un 404. Puisque je ne peux pas contrôler la précontrainte de la racine contextuelle, j'ai pensé que je pourrais contourner cela en utilisant mod_rewrite en supprimant la racine contextuelle. Malheureusement, cela ne fonctionne pas: c'est comme si le RewriteRule était totalement ignoré.

J'ai remarqué une chose étrange: une requête pour bleh: //test.example.com/test/foo.html ne sera même pas transmis à Tomcat: j'obtiens la page 404 familière d'apache httpd. Si j'entre dans une autre URL fausse, comme bleh: //test.example.com/jfaklkfdjljfkl, je reçois la page 404 de Tomcat. Je m'attends à ce que bleh: //test.example.com/test/foo.html donne un appel à bleh: // localhost: 8181 / test / test / foo.html, mais évidemment, je manque quelque chose ici.

Je suis loin d'être un expert dans ces domaines afin que toute aide soit grandement appréciée.

METTRE À JOUR

J'ai fait des progrès dans ce domaine. On m'a dit qu'il était possible de consigner la sortie de debugging à partir de mod_rewrite, donc je l'ai fait exactement. Voici la partie pertinente de ces journaux:

 [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) init rewrite engine with requested uri /test/notify [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (3) applying pattern '^/test/(.*)$' to uri '/test/notify' [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) rewrite '/test/notify' -> '/notify' [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) local path result: /notify [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (2) prefixed with document_root to /usr/local/apache/htdocs/notify [12/Oct/2011:10:57:09 +0200] [test.example.be/sid#7b1bc8][rid#820520/initial] (1) go-ahead with /usr/local/apache/htdocs/notify [OK] 

Alors, ce qui se passe ici, c'est que mod_rewrite fait exactement ce qu'il doit faire, mais pour une raison quelconque, apache ne passe pas l'url à mod_proxy, mais il prépare / usr / local / apache / htdocs et tente de résoudre cela. Donc, la nouvelle question est: comment puis-je get apache pour ne pas préciser / usr / local / apache / htdocs et simplement passer l'URL à Tomcat?

PS: J'ai dû replace 'http' par 'bleh' sur plusieurs endroits car apparemment le nombre de liens que vous pouvez publier est limité.

Utilisez simplement le drapeau [P] pour passer la requête au mod_proxy:

 RewriteRule ^/test/(.*)$ http://localhost:8181/$1 [P] 

La bonne façon de ne pas avoir le DocumentRoot pré-ajouté est soit d'utiliser la directive RewriteBase, soit d'append le drapeau PT (PassThrough) à votre règle de réécriture. Voir ici – httpd.apache.org/docs/current/rewrite/flags.html#flag_pt