2009-05-04 6 views
0

Si j'utiliser les éléments suivants comme 50 fois dans mon fichier htaccess:mod_rewrite si vous utilisez une expression partout, pouvez-vous la mettre dans une "variable"?

RewriteRule^(BLA | blo | bli | blu | bloi | bkdo | doid | Boidi | woekj | dfpo8ds de)//section_index.php $? sectionurl = $ 1 [L]

est-il alors possible de mettre simplement bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds dans une variable au lieu de l'utiliser de nouveau dans chaque ligne? Si oui, comment je fais ça?

+0

Quel est exactement votre problème? Donnez-nous un exemple de la façon dont vous pensez qu'une variable résoudrait votre problème. – Gumbo

+0

Le problème est que j'utilise cette ligne de réécriture plusieurs fois dans le fichier htaccess. Chaque fois que je dois écrire l'ensemble bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds pièce à nouveau. Donc, je voudrais juste mettre cela dans une variable et commencer à faire cela: RewriteRule^(MVARIABLE) /? $ /section_index.php?sectionurl=$1 [L] – PeterV

+0

Mais pourquoi utilisez-vous la même expression dans plus de une règle? Ou cette expression est-elle juste une sous-expression (peut-être un préfixe) d'une autre expression? Encore une fois, un exemple de telles règles serait utile. – Gumbo

Répondre

1

Vous pouvez définir une variable d'environnement:

RewriteRule ^(bla|blo|bli|blu|bloi|bkdo|doid|boidi|woekj|dfpo8ds)/?$ /section_index.php?sectionurl=$1 [L,E=FOOBAR:$1] 

La valeur est maintenant accessible avec %{ENV:FOOBAR}.


Modifier Une autre façon serait de traiter la demande dans les étapes et de la chaîne des règles:

# first path segment 
RewriteRule ^(bla|blo|bli|blu|bloi|bkdo|doid|boidi|woekj|dfpo8ds)/?([^/].*)?$ $2?sectionurl=$1 [QSA,C] 
# second path segment 
RewriteRule ^(blog|foo)/?([^/].*)?$ $2?arg1=$1 [QSA,C] 
# third path segment 
RewriteRule ^(bar|baz)/?([^/].*)?$ $2?arg2=$1 [QSA,C] 
# last rule 
RewriteRule ^$ section_index.php [L,QSA] 

Mais comme vous utilisez PHP, vous pouvez également utiliser PHP pour analyser le chemin de la requête, pour exemple:

$_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']); 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
$argNames = array('sectionurl', 'arg1', 'arg2', 'arg3'); 
foreach ($segments as $i => $segment) { 
    if (isset($argNames[$i])) { 
     $_GET[$argNames[$i]] = $segment; 
    } 
} 
var_dump($_GET); 

maintenant, il vous suffit d'envoyer toutes les demandes à ce fichier PHP en utilisant cette règle:

# exclude requests for existing files 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [L] 
+0

semble fonctionner, voici ce que j'essaie: RewriteRule^(% {ENV: FOOBAR}) /? $ /section_index.php?sectionurl=$1 [L] – PeterV

+0

Vous ne pouvez pas utiliser de variables dans le motif de recherche. Mais vous pouvez utiliser un 'RewriteCond' supplémentaire comme' RewriteCond% {ENV: FOOBAR}% {REQUEST_URI}^(bla | blo | bli | blu | bloi | bkdo | doid | boidi | woekj | dfpo8ds)/\ 1'. Mais ce n'est pas très élégant. – Gumbo

Questions connexes