2010-01-20 10 views
25

Dans ces conditions (je sais ce qu'ils veulent dire/faire):mod_rewrite: que fait ce RewriteRule?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

Qu'est-ce que la règle premier faire? À quoi sert cette course solitaire?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

J'utilise depuis un certain temps maintenant en combinaison avec le Zend Framework, mais je ne ai jamais vraiment ce que la première règle fait exactement.

Répondre

46

Le RewriteCond directive décrit simplement une condition supplémentaire pour un RewriteRule directive. Donc RewriteCond doit toujours être associé à RewriteRule.

Dans votre cas, les trois RewriteCond appartiennent probablement à la première RewriteRule comme ceci:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

Maintenant, cette règle est appliquée si le motif de l'RewriteRule correspond à l'URL de requête en cours (par répertoire chemin dépouillé avant) et si la condition est remplie.

Dans ce cas, la condition est vrai que si lors du mappage de l'URL de requête au système de fichiers, il correspond à un fichier existant avec la taille du fichier supérieur à 0 (-s), ou un lien symbolique (-l) ou un répertoire (-d). Ainsi, votre règle s'appliquera à n'importe quelle URL (^.*$ correspond à n'importe quoi) qui peut être mappée à quelque chose existant dans votre système de fichiers. La substitution - signifie juste ne rien changer. Et le NC (aucun cas, insensible à la casse, inutile dans ce contexte) et L (dernière règle si elle est appliquée) sont flags qui modifient soit le motif, le remplacement ou l'exécution de la règle.

+0

Aaahh oui, cela a du sens. Explication très claire. Je vous remercie. –

+0

Alors, quel est le but de ne pas le changer? La combinaison des deux règles de réécriture indique-t-elle "si elle existe, montrez-la, sinon transmettez tout le reste à index.php" –

+1

@WillshawMedia Oui, la règle mentionnée laisse fondamentalement inchangée toute demande à un fichier existant et quitte le processus de réécriture. Donc, en combinaison avec l'autre règle: réécrire seulement un fichier non existant à * index.php *. – Gumbo