2011-02-28 3 views
1

J'essaie de mieux comprendre mod_rewrite et j'ai un problème particulier dont je pense avoir besoin pour faire le tour en premier.Problèmes de mod_rewrite: négation

Je réécris http://www.somesite.tld/a/b/c-index.php?path=a/b/c en utilisant les éléments suivants

RewriteRule ^(?!index.php)(.*)$ index.php?path=$1 [NC,L] 

Une réécriture équivalente serait, dans ce cas, être

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?path=$1 [NC,L] 
  • Cela ne fonctionne pas sans RewriteCond - path = index.php serait le résultat sans ignorer spécifiquement les fichiers ou dire 'pas index.php'. Pourquoi est-ce?
  • En outre, quelle est la syntaxe ?! et ?: que je vois parfois utilisée? Je ne comprends pas l'utilisation du ? lorsqu'il n'est pas préfixé par quoi que ce soit.
  • Et pourquoi, dans la première RewriteRule ci-dessus, est-ce que la deuxième paire de parenthèses renvoie une correspondance pour $ 1?

Vive

Répondre

4

(?= ...) et (?! ...) est syntaxe spéciale dans les expressions régulières Perl et dans PCRE, qui est la bibliothèque regex utilisée par Apache. Ce sont, respectivement, des assertions positives et négatives de lookahead: elles correspondent à une chaîne vide si le texte qui suit ne correspond pas ou ne correspond pas au contenu entre parenthèses.

Ils ne capturent pas, donc ils ne définissent aucun $n (ce serait inutile, puisqu'ils correspondent à une chaîne vide). (?: ...) est également non-capture, il est utilisé pour regrouper les sous-expressions.

Votre première règle devrait travailler en .htaccess (mais pas dans un fichier de configuration d'hôte virtuel), mais il serait plus correct d'écrire comme

RewriteRule ^(?!index\.php$)(.*)$ index.php?path=$1 [L] 

Peut-être une autre règle interagit avec elle. Vous pouvez vérifier ce qui est exactement adapté et réécrit avec RewriteLog et RewriteLogLevel.

+0

Heureux que je pose cette question, je ne connaissais pas les assertions lookahead mais elles me semblent très utiles. – dianovich

-1

"!" signifie la négation. Comme a = 1 (a est égal à un) a! = 1 (a n'est pas égal à un); "f" signifie fichier. Donc si vous utilisez avec "!", Comme "! -f" serait quelque chose "le fichier n'existe pas". les liens ci-dessous peuvent vous aider à mieux:

http://www.askapache.com/htaccess/htaccess.html http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls/ http://corz.org/serv/tricks/htaccess2.php

+0

Cela n'explique pas pourquoi les réécritures ci-dessus fonctionnent comme elles le font, ou la syntaxe lookahead '?!'. – dianovich

+0

Et ainsi, comment écrire une condition négative? Les 2 ou 3 docs htaccess génériques ne sont pas une réponse adaptée – sboye