2009-09-30 6 views
0

J'ai un grand ensemble de règles de réécriture comme ce qui suit:mod_rewrite: correspond uniquement si aucune règle précédente n'a été trouvée?

RewriteRule ^foo foo.php?blah [L] 
RewriteRule ^bar foo.php?baz [L] 

Et puis j'avoir une sorte de fourre-tout règle que je veux appliquer que si les règles ci-dessus ne correspondent pas (par exemple pour, disons /blatz). Tant que je me souviens d'inclure le [L], cela fonctionne bien - mais j'ai déjà eu des problèmes deux fois avec accidentellement l'oublier.

Existe-t-il un moyen facile de forcer ma règle fourre-tout à ne correspond pas si une règle antérieure a correspondu? (idéalement, sans ajouter quelque chose à chaque règle)

Répondre

1

La seule solution que je peux l'image est soit d'utiliser le drapeau S pour sauter la dernière règle:

RewriteRule ^foo foo.php?blah [L,S=999] 
RewriteRule ^bar foo.php?baz [L,S=999] 
RewriteRule … 

ou pour définir une variable d'environnement:

RewriteRule ^foo foo.php?blah [L,E=FLAG:1] 
RewriteRule ^bar foo.php?baz [L,E=FLAG:1] 
RewriteCond %{ENV:FLAG} ^$ 
RewriteRule … 

Modifier D'accord, voici une autre solution qui compare l'URL actuelle à l'origine demandé à l'un:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^?\s]*)\??([^\s]*) 
RewriteCond %{REQUEST_URI}?%{QUERY_STRING}<%1?%2 ^([^<]*)<\1$ 
RewriteRule … 

Mais je pense que nécessite au moins Apache 2 parce 1.x Apache utilisé ERE POSIX et ERE ne supportent pas Posix les \n dans le modèle des backreferences.

+0

Ah ah! La solution "assurez-vous que l'URL n'a pas encore été modifiée" est astucieuse. –

Questions connexes