Comment faire fonctionner tomcat 5.5 derrière apache 2 avec mod_rewrite en transmettant les requêtes à mod_jk et en supprimant le contexte de l'application?

StackOverflow https://stackoverflow.com/questions/208261

Question

D'accord, je veux donc qu'une application Web s'exécutant dans tomcat (5.5) s'exécute derrière Apache 2 (2.2.3 pour être précis), qui sert depuis la racine du site (c'est-à-dire sans le contexte), avec du contenu statique diffusé via apache.

Donc, si l'application est en cours d'exécution sous " / myapp " sur tomcat, je veux utiliser apache (plus mod_rewrite ) pour le faire se comporter comme s'il fonctionnait sous " / ". à la place.

Mod_jk est configuré et fonctionne correctement. Je peux accéder à l'application à partir de " / myapp ", mais je ne parviens pas à faire fonctionner le dernier bit. Ci-dessous se trouve la configuration que j'ai pour mod_rewrite pour essayer de faire fonctionner cela. Il récupère correctement les URL / static / pour que apache puisse les servir à partir de la Webapp décompressée et si j'active le journal de réécriture, je constate qu'il tente de transmettre toutes les autres requêtes à / myapp. via mod_jk . Cependant, il semble que mod_jk ne traite pas la demande par la suite.


JkMount /myapp/*      worker1

RewriteEngine On

# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]

Quand j'ai déjà utilisé Apache 1 dans le passé, je devais m'assurer que mod_jk était chargé avant mod_rewrite , mais je n'arrive pas à atteindre. cela sous apache 2. Des pensées? Comment les autres font-ils habituellement cela?

Était-ce utile?

La solution

Géré pour que cela fonctionne à la fin. Il semble que je doive définir un JkOption sur:


JkOptions     +ForwardURICompat

Et ensuite mod_jk regarde l'URL réécrite. Je dois admettre que je ne suis pas tout à fait sûr de savoir pourquoi cela fonctionne, mais je crois que cela revient à une forme de comportement plus ancienne. Si quelqu'un pouvait me dire une façon meilleure / plus correcte de le faire, j'aimerais bien le savoir.

Autres conseils

Peut-être serait-il préférable d'utiliser Apache pour le proxy au lieu de mod_jk. Quelque chose comme ça:

ProxyPass / static / http: // localhost: 8080 / myapp / static /

Cela pourrait être plus facile ou plus transparent si vous utilisiez des hôtes virtuels Tomcat ou différents connecteurs pour différents hôtes et ne déployiez que les applications racine (dans "/") et configuriez le transfert Apache mod_jk vers les différents connecteurs ou hôtes virtuels. .

Remarque: lorsque j’en avais besoin, j’ai travaillé avec différents connecteurs pour différents hôtes tomcat ou moteurs (ne me souviens plus) et déployé des applications ROOT. Je n'ai jamais essayé d'hôtes virtuels (basés sur les noms) dans Tomcat, seulement en devinant que cela pourrait fonctionner.

Avantage: pas de traduction de chemin, donc beaucoup plus facile à comprendre une fois que vous devez modifier l’installation plusieurs mois après le déploiement initial.

J'avoue que cela semble un peu étrange, mais le bénéfice de la lisibilité a beaucoup de valeur pour moi.

Nous utilisons le drapeau 'R' au lieu de 'PT':

RewriteRule ^/(.*)$ /myapp/$1 [L,R]

Modifier: J'ai raté le point de ne pas modifier l'URL que l'utilisateur voit. Une autre façon de faire est de faire:

JkMount /* worker1
JkUnmount /static/* worker1

Ensuite, vous n'aurez plus besoin des règles RewriteRule.

Et conformément aux site Apache Tomcat aux nouveaux paramètres par défaut du mod_jk sont incompatibles avec mod_rewrite et vous devez utiliser + ForwardURICompatUnparsed .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top