2009-11-04 4 views
2

Je souhaite réécrire toutes mes URL pour masquer l'extension .php. Une règle générale qui ajoute à .phpévidemment toutes les URL ne fera pas, donc je veux que cette règle soit subordonnée à la condition queSuppression de .php avec mod_rewrite

  • Il n'y a aucun fichier ni répertoire qui correspond à l'URL
  • Après avoir ajouté le .php, il est un match

Je suis arrivé à ces règles de réécriture:

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

Les deux premiers vérifient si la requête peut être satisfaite sans réécriture (donc pour les images et autres contenus non-PHP). Avec la troisième règle, je voudrais vérifier si l'ajout de .php rendrait la requête valide (sinon, nous essaierons quelque chose d'autre plus bas dans les règles de réécriture, ou retournerons 404).

La partie RewriteCond %{REQUEST_FILENAME}.php -f ne semble jamais correspondre. Aucune suggestion?

EDIT

Le journal de réécriture est contenant ces entrées:

(4) RewriteCond: input='/contact' pattern='!-f' => matched 
(4) RewriteCond: input='/contact' pattern='!-d' => matched 
(4) RewriteCond: input='/contact.php' pattern='-f' => not-matched 

Je trouve étrange qu'il essaie de faire correspondre/contact, et non/var/www/monsite/htdocs/contact (Au moins c'est ce à quoi je m'attendais en lisant les documents sur REQUEST_FILENAME). Apparemment, REQUEST_FILENAME est seulement ce que je m'attends quand il y a une correspondance réelle?

EDIT2

Merci à Thomas la réponse: utiliser %{DOCUMENT_ROOT} au lieu de composer manuellement le nom complet du fichier PHP encore unfound.

J'ai aussi ajouté un '/?' dans l'expression rationnelle pour supprimer une option/à la fin de l'URL, maintenant tous/contact,/contact/et /contact.php se réfèrent tous à /contact.php:

RewriteCond %{DOCUMENT_ROOT}$1 !-f 
RewriteCond %{DOCUMENT_ROOT}$1 !-d 
RewriteCond %{DOCUMENT_ROOT}$1\.php -f 
RewriteRule ^(.*?)/?$ $1.php [L] 

MISE À JOUR

Après beaucoup de malédiction, j'ai également découvert que cela dépend si les RewriteRules sont dans une directive Directory> < ou un fichier .htaccess d'une part, ou dans votre directive VirtualHost < ou juste dans le corps principal d'un httpd. conf d'autre part. Quand à l'intérieur d'un répertoire <> /. Htaccess, %{REQUEST_FILENAME} contient le chemin de sorte que ma solution initiale devrait fonctionner là. En dehors de < Répertoire>, vous devez ajouter le %{DOCUMENT_ROOT} vous-même.

Répondre

1

Je ne suis pas sûr d'utiliser REQUEST_FILENAME. REQUEST_FILENAME doit pointer vers le chemin complet du fichier correspondant, mais vous vérifiez réellement son existence.

Je voudrais essayer quelque chose comme:

RewriteCond %{DOCUMENT_ROOT}/$1   !-f 
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f 
RewriteRule ^(.*)$      $1.php [L] 
+0

Oui du RewriteLog il semble que 'REQUEST_FILENAME' ne se rempli avec le « chemin complet du système de fichiers local » les docs vous promettent si elle a effectivement * * existe. Votre solution semble résoudre ce problème, je vais l'essayer! – Wim

+0

Peut-être sans le/$ entre $ {DOCUMENT_ROOT} et $ 1 ... – Tomas

+0

Duh dumping de code dans les commentaires ne fonctionne vraiment pas ... Quelqu'un sait-il une meilleure façon de le faire? – Wim