PDF Imprimer Envoyer

Réécriture de base avec Apache mod_rewrite


Rôle des fichiers .htaccess

Dans toutes les situations que nous considérerons par la suite, il sera nécessaire de dire à Apache quel comportement nous voulons qu'il utilise. Pour cela, Apache se base sur l'utilisation de fichier de configuration locaux, placés dans chaque répertoires, les fichiers .htaccess. Si Apache ne trouve pas de fichier portant ce nom, il utilise sa configuration global. Sinon il suit les indications du fichier .htaccess pour traiter le répertoire en question ainsi que ses répertoire fils. Pour plus d'information sur la configuration de Apache et des .htaccess (leur portée et les droits qu'ils peuvent avoir), lire la documentation officielle sur les .htaccess.

Ces fichiers .htaccess sont très simples. Il s'agit uniquement de fichiers texte. Le "." qui précède le nom est essentiel. Ne l'oubliez pas lorsque vous créerez ce fichier.Sachez que si vous placez un .htaccess dans un répertoire, il prend l'ascendant sur la configuration de base, ou sur la configuration d'un répertoire parent. Ces fichiers .htaccess servent par exemple à configurer vos pages d'erreur 404 ou à empécher l'affichage du contenu d'un dossier.

Dans la suite de ce tutorial nous supposerons que vous utilisez un .htaccess à la racine (virtuelle) de votre site web (c'est-à-dire que le fichier se trouve à l'adresse http://votre_site.fr/.htaccess). Dans un autre cas (par exemple http://votre_site.fr/blog/.htaccess) faites bien attention à la remarque concernant la notion "RewriteBase" dans la suite du tutoriel.


Démarrer le moteur de ré-écriture (Rewrite Engine)

Avant de pouvoir ré-écrire (URL rewriting) vous activez une option préalable dans le .htaccess : FollowSymLinks. C'est une propriété de sécurité du module de ré-écriture et vous ne pourrez pas modifiez vos URL sans cette option. Dans la plupart des cas elle a déjà été activée dans la configuration globale du site (http.conf ou apache2.conf), mais il est toujours sage de l'ajouter au début de votre fichier.

De manière additionnelle (à retirer selon certains serveurs), vous devez activer l'option Indexes .

Enfin, vous devez activer le module pour un fonctionnement sur l'ensemble des fichiers de votre configuration. Voilà donc à quoi ressemble un fichier .htaccess de base pour faire fonctionner la ré-écriture :

Options +FollowSymLinks
Options +Indexes
RewriteEngine On


Définir l'adresse de base (RewriteBase)

Cette commande permet de dire à apache à partir de quelle adresse web vous souhaiter ré-écrire vos URL. Si votre .htaccess se trouve à la racine du site ( c'est-à-dire accessible par l'adresse http://votre_site.fr/.htaccess) vous n'aurez à écrire que  :

RewriteBase /

Sinon, si votre .htaccess se trouve dans le répertoire 'blog' (par exemple), vous devrez modifier la ligne précédente en :

RewriteBase /blog/

Cette ligne s'insère juste après les trois précédentes.


Les règles de syntaxe de mod_rewrite

Ré-écrire une seule adresse



Les ré-écriture sont faites selon les règles que vous spécifiez. Une règle se créée selon la syntaxe suivante :

RewriteRule SOURCE DESTINATION
 
Les demandes vers "source" seront ré-écrites en "destination". Nous allons voir par la suite que "source" peut être le nom d'un fichier (sans l'adresse http://votre_site.fr devant) ou un nom générique regroupant plusieurs fichiers en fonction d'une expression régulière.
 
Commençons par un exemple simple. Vous possédez deux pages : perimee.html et actuelle.html. Vous voulez que l'utilisateur atteigne la page actuelle même lorsqu'il tape l'ancienne adresse de la page périmée (souvent le cas lorsque les liens proviennent d'un site externe qui n'a pas mis à jour les liens versvotre site). La ligne de ré-écriture sera la suivante :
 
RewriteRule perimee.html actuelle.html
 
Votre premier .htaccess ressemblera alors à cela :
 
# Mise en place de la ré-écriture
Options +FollowSymLinks
Options +Indexes
RewriteEngine On


# Adresse de base de réécriture
RewriteBase /

# Règles de ré-écriture

RewriteRule perimee.html actuelle.html
Voilà l'exemple  : page perimee.html
Vérifier l'adresse du lien, puis l'adresse de la page une fois chargée. L'adresse reste la même une fois chargée, mais la page chargée est nouvelle. Pour ré-écrire le nom de l'ancienne adresse, il faut utiliser une redirection. On évitera alors le duplicate content (référencement multiple par google, qui est mauvais pour son classement).
 

Ré-écriture pour plusieurs pages

Si vous désirez ré-écrire un nombre conséquent de pages web, il ne va pas être facile de remplir une à une toutes les redirections. C'est la raison pour laquelle nous allons utiliser des expressions régulières. Vous en connaissez peut être certaines par convention. Par exemple, le caractère '*' est un joker (wildcard en anglais) pour signifier "n'importe quelle caractère en nombre indifférent". En gros * remplace "tout et n'importe quoi". Les expressions régulières sont très puissantes et sont à la base d'une bonne ré-ériture.

Pour ceux qui sont habitués à l'utilisation des expressions régulières, vous pouvez continuer l'article, sinon, parcourez notre tutoriel sur les expressions régulières avant de lire la suite de l'article.

Considérons un cas banal : vos articles sont stockés dans une base de donnée, et un script php les affiche en fonction de la demande. La page article.php prend en argument une variable ID correspondant à l'article demandé, et cette variable est passée en GET (c'es-à-dire dans l'adresse URL). Ainsi, les visiteurs liront l'article 12 en accédant à la page http://votre_site.fr/article.php?id=12. Nous allons voir comment rendre l'URL d'accès plus esthétique en utilisant l'URL rewriting, par exemple : http://votre_site.fr/article/12 . En appliquant la règle de ré-écriture vue ci-dessus, le .htaccess contiendrait la ligne suivante :

RewriteRule ^article/12$ article.php?id=12
 
Vous voyez apparaitre ici deux caractères non présents dans l'exemple du haut : ^ et $. L'utilité de ces caractères vous est expliqué sur la page dédiées aux expressions rationnelles. Pour faire bref, si nous avions simplement écrit :
 
RewriteRule article/12 article.php?id=12
 
L'URL http://votre_site.fr/sous-article/123 aurait aussi été transformé, entraînant des problèmes de redirection et des instabilités. Nous utiliserons donc à présent les caractères de délimitation ^ et $ afin d'être assuré de bien choisir les chaînes de caractères voulues.


A présent on remarque que cette redirection marche uniquement avec l'article 12 : que se passe-t-il si notre site contient des centaines d'articles? Nous pouvons bien sûr améliorer la ligne pour traiter génériquement les articles de notre site. C'est à ce niveau là que la puissance des expressions régulières est utile :

RewriteRule ^article/([0-9]+)$ article.php?id=$1
 
Lorsque nous plaçons des parenthèses autour d'une expression régulière, nous demandons au module Apache mod-rewrite de conserver la valeur remplacée dans une variable qui s'appellera grâce à $1 (et $2 pour la deuxième parenthèse, $3 pour la troisième etc.). Nous rencontrerons plus d'exemples dans les autres articles, pour le moment une explication rapide de la nouvelle ligne : la première partie est l'adresse récupérée à partir du navigateur. Celle-ci est de la forme article/un_nombre. L'expression  ([0-9]+) va récuper l'ensemble des nombres : suite de chiffres de 0 à 9 avec au moins un chiffre (à cause du +). Ce nombre est stockée dans la variable $1. L'adresse est ensuite redirigée vers la page article.php avec en argument le nombre demandé.


Mais quel intérêt? Au delà de l'aspect purement esthétique et plus facile pour l'humain, l'URL rewriting a longtemps été utilisé pour aider les moteurs de recherche à indexer les pages dynamiques. En effet, lorsqu'un robot rencontrait la page article.php il la considérait comme une page unique, et ce quels que soient ses arguments. Actuellement les moteurs sont assez évolués pour reconnaitre les structures simples de pages dynamiques. Cependant, il se trouvera bien des occasions où l'intérêt se fera sentir, pour l'utilisateur ou le moteur de recherche (taper "seo" sur votre moteur de recherche préféré pour en voir les avantages).
 
Un exemple très intéressant qui sera peut être un jour sur le site est le suivant : en SEO il est utile de placer ses mots clés dans l'adresse de la page. Ainsi, la page article/22/Mon_titre_a_mots_cle contient des mots clés que les moteurs de recherche retiendront mieux. Il n'est pas possible avec mod rewrite d'extraire les titre de vos pages pour faire les ré-écritures, mais il vous est possible de changer les liens de votre site, et de faire une bonne redirection pour que ceux-ci pointent bien vers la page en question.
 
RewriteRule ^article/([0-9]+)/(.*)$ article.php?id=$1
 
Les mots clés seraient alors contenus dans la variable $2 (présence d'une deuxième paire de parenthèses). Cependant nous n'en avons pas besoin ici pour rediriger vers la bonne page. Cette deuxième parenthèse peux prendre un nombre infini de caractères quelconques (l'astérisque signifie 0 ou autant qu'on veut).
 

Rewrite Flags

Un "flag" est une sorte de paramètre que l'on place à la fin d'une ligne de ré-écriture pour spécifier la manière dont celle-ci sera faite. Les flags usuels se trouvent ci-dessous :

  • L - Last: lorsque la règle a été appliquée et qu'elle possède un flag L à la fin, le module de ré-écriture s'arrète et les autres règles du .htaccess ne seront pas lues. Lire [L] Last Flag pour plus d'informations.
  • R - Redirect: une RewriteRule standard, et transparente pour l'utilisateur. Ce flag permet de renvoyer au navigateur un header contenant un code de redirection (3xx) pour lui signifier que la page est redirigée. Ainsi l'adresse de la barre sera changée et apparaitra alors la nouvelle adresse. Ce flag prend en paramètre le numéro du header a renvoyé (le plus souvent 301 pour une redirection permanente). Si vous ne remplissez pas de numéro, celui par défaut est 302 (redirection temporaire). Les différences ne sont pas sensibles pour le visiteur humain, mais pour les moteurs de recherche. Lire moving pages (301).
  • QSA - Query String Append: sur les pages dynamiques, la chaîne demandée contient la variable en GET (tout ce qui se trouve après le ?). Si vous ne spécifiez pas de query string dans la page de destination, celle du visiteur est gardée, sinon, elle est remplacée par la valeur que vous aviez mise en paramètre de redirection. Pour éviter cela et conserver à la fois la variable get du visiteur et celle que vous aviez choisie, vous devez utiliser le flag QSA.
  • NC - No case: rend la comparaison inssensible à la casse (majuscules/minuscules).

Il existe encore de nombreux autres flags qui peuvent vous permettre d'accéder à des options avancées (traitement des cookies, des variables d'environnement, traitement des types mime...). Ces tags sont documentés dans la documentation officielle et ne sont pas utilisés couramment.

Pour utiliser un flag il faut le placer en fin de ligne, entourés de crochets. Vous pouvez placer plusieurs flags à la suite en les séparant par des virgules. Par exemple : 

RewriteRule ^article/([0-9]+)/(.*)l$ article.php?id=$1 [NC,L]


Mise à jour le Mardi, 21 Juillet 2009 04:42
 

Commentaires 

 
-1 # Invité 03-05-2010 16:29
Très bon article et très complet. Mais juste une question. Mettre des virgules dans son url rewriting pénalise le site ? Je pose cette question car j'ai un site de vidéos drôles (hmoudiates) avec des virgules pour chacune de ces vidéos. J'attends vos réponses avec impatience.
Répondre | Répondre en citant | Citer
 
 
0 # Invité 26-08-2010 16:05
Bonjour, et si il y a un espace dans l'url à rediriger on fait comment ? mon serveur affiche une erreur interne 500 ...
Répondre | Répondre en citant | Citer
 
 
+2 # Invité 06-01-2011 20:29
Merci, pour ce bon tuto. Il me reste un truc a trouver : Comment utiliser mon parametre ($1) comme un repertoire dans l'url de redirection au lieu de parametre d'une page php ?
Répondre | Répondre en citant | Citer
 
 
0 # Invité 12-01-2011 21:51
Cela fait plusieurs soirs que je m'évertue à comprendre comment faire fonctionner apache2 avec code igniter et je tombe sur cet article qui me permet de tout faire en qqs mns : les explications sont claires, le principe des expressions régulières est illustré en détail. Ce tutorial est un mdoèle du genre. Olivier
Répondre | Répondre en citant | Citer
 
 
-1 # Invité 04-02-2011 16:59
Merci pour ce tuto mais comme Exagon313, je suis preneur si quelqu'un a l'info pour le cas d'espace dans l'url à rediriger.
Répondre | Répondre en citant | Citer
 
 
0 # Invité 15-02-2011 13:46
J'ai également un soucis avec apache2 mais je n'arrive pas à trouver d'ou il vient...
Répondre | Répondre en citant | Citer
 
 
0 # Thierry 20-01-2012 10:19
Bonjour,
J'ai besoin d'améliorer le rewrinting sur mon site :
http://www.tout-louer.fr
Y aurait il quelqu'un qui se sent capable et pourrais me donner de l'aide ?
Répondre | Répondre en citant | Citer
 
 
+1 # Darkel 08-03-2012 13:15
Pour l'histoire des espaces,
avez vous essayé de remplacer les espaces par des %20 ?
Répondre | Répondre en citant | Citer
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir