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.
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
Peut-être sans le/$ entre $ {DOCUMENT_ROOT} et $ 1 ... – Tomas
Duh dumping de code dans les commentaires ne fonctionne vraiment pas ... Quelqu'un sait-il une meilleure façon de le faire? – Wim