2 votes

Pourquoi le mod_rewrite ne retraite-t-il pas les chemins réécrits ?

Je suis en train de réécrire un chemin pour définir une variable d'environnement qui fera en sorte que mod_jk utilise un serveur JBoss spécifique. Cela fonctionne parfaitement avec tous les chemins d'accès aux applications.

Lorsque j'essaie notre servelet de surveillance (qui effectue une simple récupération de données pour prouver que la pile est opérationnelle), il correspond à la réécriture, effectue la réécriture, définit la variable env, mais ne parvient pas à traiter l'URL une deuxième fois.

Pourquoi le comportement incohérent du deuxième passage dans le moteur de réécriture ?

Le motif est que si /workername/ est ajouté au début du chemin d'accès, il supprimera cette valeur mais l'utilisera comme la valeur JK_WORKER_NAME pour le montage mod_jk.

Exemple de configuration :

SetHandler jakarta-servlet  
SetEnv JK_WORKER_NAME mexico

RewriteEngine on
RewriteRule ^/(mexico[1-2])/(.*)$ /$2  [E=JK_WORKER_NAME:$1,L] 

(les travailleurs du mod_jk sont nommés mexico1 et mexico2)

Un coup pour https://hostname/mexico2/public/gateway.sf sont réécrits, puis passent une seconde fois dans le moteur de réécriture, sont traités par mod_JK et transmis au serveur d'applications. Tout va bien, voir le journal (défilement vers la droite pour les bonnes parties).

10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (2) init rewrite engine with requested uri /mexico2/public/gateway.sf
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (3) applying pattern '.*' to uri '/mexico2/public/gateway.sf'
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (4) RewriteCond: input='GET' pattern='^TRACE' => not-matched
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (3) applying pattern '^/(mexico[1-2])/(.*)$' to uri '/mexico2/public/gateway.sf'
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (2) rewrite '/mexico2/public/gateway.sf' -> '/public/gateway.sf'
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (2) local path result: /public/gateway.sf
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (2) prefixed with document_root to /data/publisher/webdav/images/notice/public/gateway.sf
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde6fae0/initial] (1) go-ahead with /data/publisher/webdav/images/notice/public/gateway.sf [OK]
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde84180/initial] (2) init rewrite engine with requested uri /public/gateway.sf
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde84180/initial] (3) applying pattern '.*' to uri '/public/gateway.sf'
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde84180/initial] (4) RewriteCond: input='GET' pattern='^TRACE' => not-matched
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde84180/initial] (3) applying pattern '^/(mexico[1-2])/(.*)$' to uri '/public/gateway.sf'
10.1.1.163 - - [26/Aug/2013:14:10:44 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde84180/initial] (1) pass through /public/gateway.sf

Un coup pour https://hostname/mexico1/monitorme.mmm correspond également à la condition et est réécrit, mais il n'obtient jamais un second passage dans le moteur et Apache essaie de servir ce chemin à partir de la racine du document. Tous les résultats sont transmis à JBoss, mais il n'y a aucun document dans la racine du document. J'obtiens donc une page non trouvée.

10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (2) init rewrite engine with requested uri /mexico1/monitorme.mmm
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (3) applying pattern '.*' to uri '/mexico1/monitorme.mmm'
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (4) RewriteCond: input='GET' pattern='^TRACE' => not-matched
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (3) applying pattern '^/(mexico[1-2])/(.*)$' to uri '/mexico1/monitorme.mmm'
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (2) rewrite '/mexico1/monitorme.mmm' -> '/monitorme.mmm'
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (2) local path result: /monitorme.mmm
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (2) prefixed with document_root to /data/publisher/webdav/images/notice/monitorme.mmm
10.1.1.163 - - [26/Aug/2013:14:12:17 --0400] [publisher.internal.test.hnw.com/sid#2ad8c96bc310][rid#2ad8bde71af0/initial] (1) go-ahead with /data/publisher/webdav/images/notice/monitorme.mmm [OK]

1voto

Qben Points 238

Il est un peu surprenant que la première exécution fonctionne si vous utilisez l'exemple RewriteRule ci-dessus. Je pensais L était censé arrêter l'exécution quand il a frappé. Je pense que vous devriez utiliser N au lieu de L .

Je ne l'ai pas essayé et je ne peux pas me qualifier d'expert en la matière. mod_rewrite expert. :-)

last|L : Stop the rewriting process immediately and don't apply any more rules. Especially note caveats for per-directory and .htaccess context (see also the END flag).

next|N : Re-run the rewriting process, starting again with the first rule, using the result of the ruleset so far as a starting point.

0 votes

Merci de m'avoir fait découvrir le drapeau N. J'ai aussi pensé que cela ferait l'affaire et j'ai essayé, mais ça n'a pas marché. J'ai finalement essayé le Pass Through [PT] et bien qu'un peu bâclé, cela fonctionne. L'URL dans le navigateur ne change pas, mais dans le journal, il montre que la réécriture a bien lieu. Et plus important encore, mod_jk et jboss le reconnaissent et servent la page/servlet correcte.

0 votes

La principale différence que je vois est qu'avec N ou L, l'URL de l'application passe deux fois et se termine par un "passage par /public/gateway.sf". Le servlet monitorme.mmm se termine par "go-ahead with {redacted path to docroot} [OK]". Si j'utilise PT, il semble forcer le "passage par" à la conclusion.

0 votes

Si vous trouvez une solution qui vous convient, veuillez répondre à votre propre question pour des références futures. De plus, je suis intéressé de voir quelle est la solution :-)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X