2009-09-16 6 views
0

J'utilise le mod_rewrite d'Apache pour que l'URL de mon application soit jolie. J'ai les bases de mod_rewrite down pat - plusieurs parties de mon application utilisent des réécritures simples et prévisibles.Faire face à plusieurs paramètres optionnels avec mod_rewrite

Cependant, j'ai écrit une fonction de blog, qui utilise plusieurs paramètres différents.

http://www.somedomain.com/blog/ 
http://www.somedomain.com/blog/tag/ 
http://www.somedomain.com/blog/page/2/ 

Je les règles suivantes dans mon .htaccess:

RewriteRule ^blog/ index.php?action=blog [NC] 
RewriteRule ^blog/(.*) index.php?action=blog&tag=$1 [NC] 
RewriteRule ^blog/page/(.*) index.php?action=blog&page=$1 [NC] 

Cependant, les règles ne fonctionnent pas ensemble. L'ordinateur correspond à la première règle, puis arrête le traitement - même si, à mon avis, il ne devrait pas correspondre. Je dis à la machine de correspondre ^blog/ et il va de l'avant et correspond ^blog/tag/ et ^blog/page/2/ qui me semble erroné.

Qu'est-ce qui ne va pas avec mes règles? Pourquoi ne sont-ils pas évalués comme je l'ai prévu?

Edit: La réponse a été de mettre fin à l'entrée à l'aide $ et réordonner les règles, imperceptiblement:

RewriteRule ^blog/$ index.php?action=blog [NC,L] 
RewriteRule ^blog/page/(.*)$ index.php?action=blog&page=$1 [NC,L] 
RewriteRule ^blog/(.*)$ index.php?action=blog&tag=$1 [NC,L] 

Ces règles ont produit l'effet désiré.

Répondre

2

Si vous ne voulez pas ^blog/ faire correspondre quelque chose de plus que cela, spécifiez la fin de l'entrée dans le match ainsi:

^blog/$ 

Cependant, la façon dont de nombreuses applications font est d'avoir juste un page unique vers laquelle redirigent toutes les URL, puis traite le reste de l'URL en interne dans le code de la page. Habituellement, la plupart des langages Web ont un moyen d'obtenir l'URI de la requête d'origine, qui peut être analysée pour déterminer quelles "variables" ont été spécifiées, même si Apache les pointe toutes sur la même page. Puis, via includes ou un autre moteur de framework/template, vous pouvez charger la logique appropriée. Comme une autre note - habituellement les règles de réécriture "plus générales" sont mises en dernier, de sorte que les choses qui correspondent à une redirection plus spécifique seront traitées en premier. Ceci, couplé avec l'option [L] après la règle, garantira que si une règle plus spécifique correspond, les plus générales ne seront pas évaluées.

+0

Dav, votre partie « fin de l'entrée » a été très utile. Je vais mettre à jour ma question pour refléter la réponse. Merci! – EvilChookie

2

Je pense que vous devez ajouter un [L] après la [NC] déclarations par ailleurs, il transportera sur même si son déjà été égalée

+0

Vous avez raison. À l'origine, je les avais dans mes règles, mais je les ai pris comme partie de la farce. – EvilChookie

Questions connexes