2010-06-21 7 views
6

J'ai un site où toutes les pages sont des scripts php, donc les URL se terminent par .php.Utilisation de mod_rewrite pour masquer .php à la fin des URL

J'ai ajouté ce qui suit dans un fichier .htaccess, et je peux maintenant accéder aux fichiers .php sans l'extension .php:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php # serve the PHP file 

Jusqu'à présent, si bon. Mais maintenant je veux ajouter une redirection sur tous les fichiers .php afin que tous les anciens liens en dehors de mon contrôle soient redirigés vers la nouvelle version de l'URL.

J'ai essayé ceci:

RewriteEngine On # Turn on rewriting 

RewriteCond %{REQUEST_URI} .*\.php 
RewriteRule ^(.*)\.php$ http://example.com/$1 [R=permanent,L] 

RewriteCond %{REQUEST_FILENAME}.php -f # If the requested file with .php on the end exists 
RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 

mais qui semble envoyer une redirection même pour les URL qui ne se terminent pas par .php, donc je suis coincé dans une boucle infinie. Toute autre combinaison que j'essaie semble ne correspondre à aucune demande (et me laisser à page.php) ou toutes les demandes (et me coincer dans une boucle).

+1

http://stackoverflow.com/questions/3024631/htaccess-remove-php-extension-index-php-and-add-trailing-slash/ – TheDeadMedic

Répondre

7
RewriteEngine On 

RewriteCond %{THE_REQUEST} ^\w+\ /(.*)\.php(\?.*)?\ HTTP/ 
RewriteRule^http://%{HTTP_HOST}/%1 [R=301] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .* $0.php 

Seulement %{THE_REQUEST} n'est pas réécrite dans la redirection interne qui se passe dans la seconde règle (%{REQUEST_URI}, d'autre part, est).

0

Vous allez être redirigé pages se terminant par .php à la page sans .php

Ensuite, votre première règle rewites toutes les pages ne se termine pas avec .php au nom de la page se terminant par .php

C'est pourquoi vous avez une boucle :-)

+0

J'ai réécrit la question avec mon fichier .htaccess dans plein. La règle qui ajoute le .php vient après celle qui le supprime et redirige. AFAICS, quelque chose ne va pas avec le RewriteCond – rjmunro

0

Ajouter NS à la liste des paramètres de cette dernière règle

+0

Je pensais que cela fonctionnerait aussi, mais cela ne semble pas fonctionner. En outre, pour la condition 'RewriteCond% {IS_SUBREQ} = false', j'obtiens' [localhost/sid # 1fd6de0] [se débarrasser # 5aa2e20/initial/redir # 1] (4) [perdir U:/htdocs /] RewriteCond: entrée = 'false' pattern = '= false' => matched' – Artefacto

+0

Cela n'a pas fonctionné pour moi. – rjmunro

0

Vous pourriez être en mesure d'ajouter également [L] au RewriteRule pour ajouter .php, de sorte qu'il cesse de processus ing autres règles:

RewriteRule ^(.*)$ $1.php [L] # serve the PHP file 
+0

J'ai essayé cela et cela n'a fait aucune différence. Je l'ai ajouté à la version dans la question pour sauver l'ambiguïté. – rjmunro

0

Merci à un pointeur vers this question par @TheDeadMedic, j'ai pu trouver une solution à mon problème en changeant:

RewriteCond %{REQUEST_URI} .*\.php 

à:

RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP 

Je ne comprends pas pourquoi ma version n'a pas fait la même chose, cependant.

+0

Voir ma réponse. Votre solution n'est que légèrement différente (ne fonctionne que pour les requêtes GET). – Artefacto

Questions connexes