2010-10-12 6 views
1

salutations tous i ont des règles qui sont très semblablesURLRewriteFilter & Break après quelques règles

<rule> 
    <from>/a/**/b/**/c/**/d</from> 
    <to>/somePlace</to> 
</rule> 

    <rule> 
    <from>/a/**/b/**/c</from> 
    <to>/anotherPlace1</to> 
</rule> 

    <rule> 
    <from>/a/**/b</from> 
    <to>/anotherPlace2</to> 
</rule> 

et je veux quand une correspondance exacte se produit pour la première règle, il est seulement exécuté et les autres règles ne sont pas, comme la rupture dans la programmation, des idées comment le faire?

Répondre

4

Avez-vous essayé de changer la première règle à l'instruction à:

<to last="true">/somePlace</to> 
+0

Cela devrait être la réponse acceptée! La réponse ci-dessus ne résout pas le problème car UrlRewriteFilter traite toutes les règles par défaut. –

-1

les règles sont exécutées dans l'ordre - si elle correspond à la première règle, il exécutera, si elle ne marche pas, il ira à l'autre et ainsi de suite

donc vous devez commander vos règles par priorité et qui DEVRAIENT aider

paul

+0

donc vous dites dans l'ordre actuel, si j'écris quelque chose qui correspond à la première règle, seulement la première règle sera exécutée? –

+0

je ne sais pas si vous utilisez IIS réécriture, mod_rewrite pour php, fichier .htaccess ou une 3ème partie mais quand une règle est trouvée car elle fonctionne en bas puis en liste puis elle sera exécutée, il y a un moyen d'arrêter d'autres règles en cours d'exécution avec certains moteurs mais je ne sais pas si vous avez activé cette règle ou non – stack72

+0

J'utilise tuckey si vous êtes familier –

1

Si vous utilisez OCPsoft Rewrite URLRewriteFilter, vous peut réaliser la même chose en utilisant le contrôle du cycle de vie:

.defineRule() 
    .when(Direction.isInbound().and(Path.matches("/some/{page}/"))) 
    .perform(Forward.to("/new-{page}/")); 

Si nous voulons arrêter le traitement des règles, nous pouvons marquer le cycle de vie comme « manipulés » et aucune autre règle seront traitées.

.defineRule() 
    .when(Direction.isInbound().and(Path.matches("/other/{page}/"))) 
    .perform(Lifecycle.handled()); 

Par la suite, nous pouvons également utiliser les Lifecycle.proceed() ou Lifecycle.abort() contrôles pour poursuivre le traitement même si elle a déjà marqué traité (dans la même règle) ou mettre fin à la demande complètement (l'ensemble HttpServletRequest l'interruption,) respectivement.