2009-03-30 9 views
12

J'utilise des règles mod_rewrite simples pour mon CMS depuis des années et je suis en train de faire une nouvelle version, je vois que le rewriteCond n'a pas de sens - j'ai la norme "si ce n'est pas un fichier "mais je vois toujours les réécritures étant évaluées même si elles ne sont pas censées le faire. Mon code de réécriture:.htaccess! -f règle ne fonctionne pas

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 

je charge/page/var et il fonctionne très bien comme index.php page = & var = var, mais je tente de charger /css/file.css et charges index?. php? page = css & var = fichier.css même si /css/file.css est un fichier, donc toute la section de réécriture ne devrait même pas être évaluée. Je n'ai jamais vu htaccess apparemment défier sa propre logique, quelqu'un peut-il m'aider à comprendre cela? Est-ce que quelqu'un a jamais rencontré quelque chose comme ça?

Répondre

3

Eh bien, cela devrait fonctionner.

Essayez de régler les accessoires suivants dans votre .htaccess:

RewriteLog /var/log/rewrite.log 
RewriteLogLevel 3 

Pour déboguer vos demandes. N'oubliez pas de réinitialiser cette valeur une fois que vous avez terminé, sinon vous vous retrouverez avec un disque dur plein.

+0

+1 pour les choses RewriteLog, cela m'a aidé à déboguer mes règles de réécriture. –

25

Les RewriteCondition ne s'appliquent qu'à la règle suivante. Vous voulez ceci:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)$ index.php?page=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([^/]+)/([^/]+)$ index.php?page=$1&var=$2 
+2

C'est génial, après toutes ces années à faire des mod_rewrites comme ça, il s'avère que ma logique a fonctionné par accident ... merci beaucoup –

+0

génial, merci !! .. il est également bon de garder à l'esprit que si le fichier n'existe pas , il ne sera pas 404, il passera juste à la prochaine règle. – Roberto

+0

@Colin - mes sentiments exactement. Maintenant, je dois savoir si c'est un soulagement, ou un souci ... – Ben

13

Si vous utilisez Apache 2.2, vous devez lire ceci:

http://amandine.aupetit.info/135/apache2-mod_rewrite/

Spoiler: ce que vous aurez besoin d'écrire est en fait:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-l   

Merc.

+0

Ajout du problème résolu '% {DOCUMENT_ROOT}'. – hlcs

+1

Je l'ai cherché pendant si longtemps, totalement résolu mon problème (je n'utilise pas vhost, mais conteneur). Merci! – Gildas

+0

Comme le demandeur n'acceptera pas de réponse, ce serait génial si ma réponse obtenait le plus de remises vraiment ... – Merc