2009-11-09 6 views
2

Je voulais juste faire une chose simple avec mod_rewrite. J'ai un site qui utilise des fichiers .php, et je voulais réécrire ceux-ci à des URL plus propres, et supprimer le .php. Ainsi, les fichiers seraient www.mysite.com/contact et ainsi de suite.mod_rewrite pour supprimer .php mais toujours servir le fichier .php?

Cela fonctionne comme je le voulais, mais je m'attendais à ce qu'il serve toujours mon fichier contact.php, mais montre simplement à l'utilisateur qu'ils étaient à/contact plutôt que contact.php. Mais, il cherche un fichier appelé juste contact, qui, n'est pas là.

Alors, qu'est-ce que je dois faire, utilisez toujours mon fichier contact.php, mais réécrivez l'URL de l'utilisateur à/contact?

Voici ce que je suis en utilisant:

SetEnv APPLICATION_ENV development 
RewriteEngine on 
RewriteBase/

# Always use www. 
RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC] 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] 

# Change urlpath.php to urlpath 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
RewriteRule ^(.*)\.php$ http://www.mysite.com/$1 [L,R=301] 

Répondre

7

Pour cette solution, j'ai suivi les règles suivantes:

  1. Si l'utilisateur tente de charger /something.php ils devraient être redirigés vers l'extérieur /something.
  2. Si l'utilisateur tente de charger /something, il doit ensuite être redirigé en interne vers /something.php.
  3. Si l'utilisateur a transmis des paramètres de chaîne de requête à l'URL, ceux-ci doivent être conservés via les redirections.
  4. Si l'utilisateur essaie de charger un fichier différent qui existe réellement sur le système de fichiers (une feuille de style, une image, etc.), il doit être chargé tel quel.

Et voici le dernier jeu de la magie mod_rewrite:

RewriteEngine on 
RewriteBase/

## Always use www. 
RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC] 
RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] 

# Change urlpath.php to urlpath 
## Only perform this rule if we're on the expected domain 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
## Don't perform this rule if we've already been redirected internally 
RewriteCond %{QUERY_STRING} !internal=1 [NC] 
## Redirect the user externally to the non PHP URL 
RewriteRule ^(.*)\.php$ $1 [L,R=301] 

# if the user requests /something we need to serve the php version if it exists 

## Only perform this rule if we're on the expected domain 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
## Perform this rule only if a file with this name does not exist 
RewriteCond %{REQUEST_FILENAME} !-f 
## Perform this rule if the requested file doesn't end with '.php' 
RewriteCond %{REQUEST_FILENAME} !\.php$ [NC] 
## Only perform this rule if we're not requesting the index page 
RewriteCond %{REQUEST_URI} !^/$ 
## Finally, rewrite the URL internally, passing through the user's query string 
## using the [qsa] flag along with an 'internal=1' identifier so that our first 
## RewriteRule knows we've already redirected once. 
RewriteRule ^(.*)$ $1.php?internal=1 [L, QSA] 
+0

Le seul problème avec celui-ci est que lorsque vous allez sur www.mysite.com, il ne prendra pas le fichier index.php. Que devons-nous ajouter à cette règle pour nous assurer que ce seront des fichiers d'index dans un répertoire? –

+0

Belle prise. J'ai ajouté un 'RewriteCond' au dernier bloc pour ne pas exécuter le' RewriteRule' si nous demandons la page d'index. – NeilCrosby

+0

La bonne façon d'ajouter un paramètre de requête est d'utiliser l'indicateur QSA. – Fozi

2

Votre troisième règle devrait être l'inverse:

# Change urlpath.php to urlpath 
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] 
RewriteCond %{REQUEST_FILENAME} !\.php$ [NC] 
RewriteRule ^/?(.*)$ $1.php [L,R=301] 

Une fois que l'utilisateur va/contact, il chargera contact.php . Le RewriteCond supplémentaire est de sorte que si les gens vont à contact.php, il ne va pas essayer de charger contact.php.php

+0

Le seul problème avec cela, est qu'il reformule des images, ect avec une extension css .php. –

0

Comme je comprends, vous voulez que l'URL soit/contact même si l'URL était/contact. php.

Vous pouvez rechercher l'extension .php et effectuer une redirection pour la supprimer. Utilisez R = 301 (comme vous le faites).

Ensuite, vous devez faire en sorte que votre serveur accepte l'URL sans l'extension .php. Il pourrait effectivement déjà le faire.

C'est ce que fait mod_negotiation. Il devrait être installé par défaut, mais vous devrez peut-être l'activer.

Vous pouvez également le faire avec mod_rewrite, mais supprimez le R des options. Il redirigera en interne au lieu de répondre avec une redirection HTTP.

Questions connexes