Accueil > Développement > Programmation > Le fichier .htaccess (2)

Le fichier .htaccess (2)

Après l’accès protégé à un site, voici l’URL Rewriting.

lundi 17 avril 2006, par Prélude

Ce simple petit fichier texte qu’est le .htaccess permet néanmoins beaucoup de choses dont une qui est très certainement la plus utilisée : l’URL rewriting.

URL Rewriting

Sous ce terme un peu barbare se cache une possibilité très simple, mais très puissante : la réécriture "à la volée" des URL.

Pour faire simple, lorsque vous avez une base de données avec, par exemple, des prénoms et que vous souhaitez que vos pages contiennent dans leur adresse les prénoms en question, la réécriture d’URL vous permettra de la faire sans trop de difficulté.

Prenons un exemple concret :
Vos URLs sont actuellement de cette forme :

http://www.monsite.com/fiche-prenom.php?id=12

Vous souhaitez changer cela et avoir des URLs plus simple de la forme :

http://www.monsite.com/fiche-12.htm

Comment faire cela à l’aide du fichier .htaccess ? Voici le fichier .htaccess correspondant :

RewriteEngine on
RewriteRule ^fiche-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]

La première instruction est indispensable et permet d’indiquer au serveur que la mise en place de la réécriture des URLs à la volée.

La seconde instruction indique comment si prendre :

RewriteRule : c’est un mot clef : il introduit une règle de réécriture.
^fiche-([0-9]+)\.htm$ : la première partie de la règle. C’est la chaîne qui va être cherchée par le module pour être remplacée par la seconde partie de la règle. Le caractère ^ indique le début de la ligne et le caractère $ indique la fin.
fiche-prenom.php ?id=$1 : seconde partie de la règle. C’est ce qui va remplacer la première partie. Les caractères $1 indique un paramètre. Ici, c’est le premier paramètre qui était indiqué entre parenthèse dans la première partie.
[L] : indique que cette règle est la dernière (c’est un flag) à appliquer dans ce cas (L = Last).

La première partie de la règle est composée d’expressions régulières. Ici, nous avons ([0-9]+) qui correspond à des chiffres de 0 à 9 répétés n fois.
Donc, la première partie de la règle va rechercher des chaînes de caractères qui correspondent par exemple à :
- fiche-12.htm
- ou : fiche-123.htm
- mais pas : fiche-a12.htm

Voici quelques expressions régulières à connaître :

expressionssignification
.remplace n’importe quel caractère
[0-9]un chiffre de 0 à 9
[a-z]un caractère de a à z en minuscule
[^abcd]tout caractère sauf l’un de cette liste
[abcd]l’un des caractères de cette liste (soit a, b, c ou d)
+une ou plus occurence(s) de l’expression qui précède
*aucune ou plus occurence(s) de l’expression qui précède
\permet d’échapper un caractère. Par exemple, pour utiliser le "." : \.

Il y en a d’autres plus ou moins complexes que vous pouvez trouver ici : http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

Pour aller plus loin

C’est bien beau tout ça, mais si au lieu d’avoir une URL du genre : fiche-12.htm, on avait fiche-jean.htm ce serait tout de même un peu mieux, non ?!
Il y a deux solutions pour résoudre ce problème. Une très simple et une autre un peu moins.

La solution la plus simple consiste a rajouter au sein de l’URL le numéro de la fiche en plus du prénom et de ne pas tenir compte du prénom : fiche-jean-12.htm

RewriteEngine on
RewriteRule ^fiche-[.]*-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]

Qu’importe le prénom qui se trouve dans l’URL, c’est le numéro de la fiche qui est pris en compte.
Les deux URL suivante donneront la même fiche :

http://www.monsite.com/fiche-jean-12.htm
http://www.monsite.com/fiche-bernard-12.htm

La seconde solution consiste à placer dans la base de données la chaîne qui sera utilisée dans l’URL. Cette chaîne doit être unique afin de pouvoir effectuer des recherches dans la base évidement. Si vous avez plusieurs Jean dans la base, il faudra, par exemple, ajouter un numéro à la fin ou une lettre.

RewriteEngine on
RewriteRule ^fiche-([.]+)\.htm$  fiche-prenom.php?id=$1  [L]

Il vous est possible également de cumuler les règles :

RewriteEngine on
RewriteRule ^fiche-[.]*-([0-9]+)\.htm$  fiche-prenom.php?id=$1  [L]
RewriteRule ^agenda-[.]*-([0-9]+)\.htm$  agenda.php?id=$1  [L]

Vous pouvez également avoir plusieurs paramètres :

RewriteEngine on
RewriteRule ^fiche-([0-9]+)-([0-9]+)\.htm$  fiche-prenom.php?id=$1&page=$2  [L]

Au passage, pour les pages d’erreurs, vous pouvez également définir une ligne dans votre fichier .htaccess au début de ce fichier :

ErrorDocument  404  /erreur-404.php

Si un visiteur demande une page qui n’existe pas, il tombera alors sur la page nommée "erreur-404.php".

Il existe encore beaucoup de possibilités pour ce petit fichier .htaccess que nous verront dans un prochain article.