2009-11-16 6 views
3

J'ai récemment ajouté ce petit bout de code à mon dossier .htaccess:rewrite htaccess provoque erreur 500 au lieu de 404

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ $1.php [L,QSA] 

Ok, je comprends ce qui se passe ici, je pense. Ce petit bout de code pour supprimer les extensions de fichier PHP provoque une boucle si le document n'est pas trouvé. Cette boucle provoque une erreur de 500 serveurs au lieu de la (correcte) 404. Malheureusement, j'ai très peu de compréhension de ce que font réellement ces réécritures, donc je ne sais pas comment le réécrire pour déclencher cette redirection seulement si le document existe.

J'ai fait quelques lectures et je ne suis pas sûr de ce qu'Apache considère comme un fichier "normal". Je veux dire que cela fonctionne, mais pourquoi la première ligne ne serait-elle pas -f au lieu de !-f? Est -u le seul moyen d'accomplir cela?

Répondre

19

Vous devriez vérifier si de nouveaux points de chemin vers un fichier existant:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L,QSA] 

Sinon, vous obtiendrez une récursion infinie (erreur 500).

+0

Bingo. C'était ça. –

+5

+1000 internets à vous monsieur, été à la recherche de la réponse à cette question pour une heure. –

+0

fait ma journée! +1 – Fabian

0

Tout d'abord, voici une référence pour mieux comprendre le module mod_rewrite:

mod_rewrite Documentation

mod_rewrite Cheat Sheet

Le problème que vous voyez est qu'il est de vérifier pour les deux conditions, la valeur par défaut est [ ET], lorsque vous voulez seulement en vérifier un, essayez ceci:

RewriteCond %{REQUEST_FILENAME} !-f [OR] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ $1.php [L,QSA] 
+0

Je pense que les 2 RewriteConds sont corrects comme une condition ET. c'est-à-dire que la requête ne correspond pas à un fichier réel ET que la requête ne correspond pas à un répertoire réel. – mikej

+1

A droite, sinon c'est toujours vrai (un objet ne peut pas être un fichier ET un répertoire), donc si vous testez "(PAS un fichier) OU (PAS un répertoire)" vous obtenez "VRAI OU FAUX" pour les répertoires et "FAUX" OU VRAI "pour les fichiers, tous les deux évaluent à VRAI. Je sais que c'est un vieux post, mais je me suis dit que je fournirais une petite explication pour quelqu'un d'autre qui arrive en essayant de travailler avec leurs réécrits :) –

2

L'intention de ces Comme vous l'avez suggéré, les règles permettent à quelqu'un de demander une page sans inclure l'extension PHP. Donc, si vous aviez un fichier sur exemple.com appelé about.php alors quelqu'un pourrait utiliser l'URL http://example.com/about pour y accéder.

Toutefois, si quelqu'un demande http://example.com/about.php directement vous ne voulez pas qu'il soit réécrite comme http://example.com/about.php.php. De même, vous ne voulez pas que les demandes d'images, de feuilles de style CSS, etc. soient réécrites. C'est là que les 2 RewriteConds entrent en jeu, ce sont des conditions qui disent que la réécriture ne devrait avoir lieu que si la requête ne correspond pas à un fichier (!-f) ou un répertoire (!-d) qui existe réellement sur le site.

Pour répondre à la raison pour laquelle vous obtenez un 500, cela peut être dû au fait que les autorisations dans Apache sont configurées pour ne pas autoriser les règles de réécriture dans un fichier htaccess ou pour plusieurs autres raisons. Vérifiez la fin de votre error_log pour voir s'il y a des messages là-dedans.

+0

Merci pour la clarification sur le commutateur -f, je comprends maintenant . Mais je pense qu'il tenterait de transmettre à 404.php, puis il y aurait une erreur 404, pas sauter dans les boucles. Je ne vois rien dans notre journal d'erreurs lié à ceci, qui semble ... faux. Une erreur de serveur ne devrait-elle pas toujours mettre quelque chose dans le journal? –

+0

Quel est votre ErrorDocument (spécifiant la page 404) actuellement défini? – mikej