Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

L' URL Rewriting - APACHE mod_rewrite


Découvrons la réécriture d'URL "à la volée".

Il était impossible de créer ce site sur les regex sans vous parler du MOD_Rewrite du serveur Apache qui permet de réécrire les URL à la volée (aussi appelé URL Rewriting). Ce module, en effet, utilise toute la puissance des expressions régulières.

1) Installation

Pour utiliser le module de réécriture des URL à la volée, votre hébergeur doit avoir activé ce MOD, ou vous devez avoir accès au paramètre de configuration d'Apache (fichier httpd.conf).

a) Vérifier - Actif ou pas ?
Le meilleur moyen de savoir si le module est actif c'est de le vérifier avec le phpinfo();
Dans la section Apache Loaded Modules, vous devez trouver la mention mod_rewrite. Si vous ne trouvez pas, rien n'est perdu, passez au point b)

b) Activer le module
Si vous avez accès au fichier de config ou si vous possédez un dédié, il suffit d'ouvrir le httpd.conf dans le dossier Apache et de décommenter les 2 lignes suivantes en enlevant le # en début de ligne :

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

/!\ Dès que cela est fait, n'oubliez-pas de redémarrer Apache.

Si le point a) et le point b) se sont révélés tous deux négatifs, rien n'est encore perdu, vous pouvez quand même passer au point c) et faire un ultime test.

c) Tester
A partir de cet instant, on entre réellement dans le vif du sujet :
- Commencez par créer une page test.php à la racine de votre serveur. - Vous y insérerez un simple texte : "Bonjour, on teste le mod_rewrite d'Apache"
- Créez un fichier .htaccess et vous y insérerez le code suivant :

RewriteEngine on
RewriteRule ^test\.html$ /test.php [L]

- Déposez ce "htaccess" et votre page "test.php" via votre FTP à la racine de votre site (*)
* ou dans un même répertoire

Il ne vous reste plus qu'à entrer l'URL suivante dans votre navigateur favori : http://votresite.com/test.html, et vous devriez voir apparaître le texte de la page "test.php".

Et là, deux hypothèses :
- soit la page apparaît et l' URL test.html est bien réécrite en test.php
- soit vous avez une erreur 404, ou plus probable une erreur 500 et là... rien à faire, le mod_rewrite n'est pas actif chez votre hébergeur.

Dans ce deuxième cas, enlevez immédiatement le htaccess via votre client FTP

d) Explications du code insérez dans votre htaccess

RewriteEngine on
Cette ligne est une instruction qui active la réécriture d'URL. Peu importe les règles de réécriture que vous mettrez en place, cette instruction devra toujours être mise dans votre fichier htaccess.

RewriteRule ^test\.html$ /test.php
Cette ligne est la règle d'écriture proprement dite et nous allons la détailler :

RewriteRule C'est un mot-clé indispensable qui introduit chaque règle d'écriture

^test\.html$ Cette ligne détermine la partie qui devra être recherchée afin de la réécrire.
Vous y trouver les deux caractères spéciaux de début et fin de chaîne que vous connaissez avec les autres motifs de regex.

/test.php est la chaîne qui remplacera celle trouvée par la regex. C'est en général le nom de page qui existe vraiment sur votre espace.
[L] Il s'agit d'un flag (drapeau) qui signifie que la règle est la dernière à être appliquée pour ce cas et que le module ne doit plus tenter de réécrire cette chaîne. En gros, on applique la règle une seule fois et basta.


La réécriture d'url étant une manipulation créée par l'utilisateur, il convient de faire très attention à ce qu'on met dans son htaccess afin de ne pas tomber dans des excès qui mettraient le serveur sur les rotules. Bien qu'ils soient généralement correctement configurés pour ne pas tomber dans ce genre de piège, je le répète... faites très attention !
Rappelez-vous que prudence est mère de sûreté !

2) Réécrire des URL dynamiques

Le cas le plus fréquent de l'emploi de l'URL Rewrite est la réécriture des URL de votre site afin de présenter à l'internaute une url plus mnémotechnique, facilitant dans la foulée son indexation par les moteurs de recherche qui ne laisseront plus sur le côté des pages dynamiques avec de multiples paramètres.
Votre site dynamique comporte surement des URL du genre :

http://votresite.com/frames.php?page=index&view=source
http://votresite.com/photo.php?album=12&id=1

.... ce qui n' est pas très joli, difficilement mémorisable et finalement qui pose de réels problèmes d'indexation aux moteurs de recherche. En effet la plupart ne prennent en compte qu'un nombre limité de paramètres dans l' URL, voir qui les ignorent complètement !

Nous allons donc réécrire ces URL d'une manière plus jolie.

http://votresite.com/frames.php?page=index&view=source
deviendra : http://votresite.com/index.source.html
http://votresite.com/photo.php?album=12&id=1
deviendra : http://votresite.com/photo/12/1

La première URL :

RewriteEngine on
RewriteRule ([a-z]+)\.([a-z]+)\.html$ /frames.php?page=$1&view=$2

La deuxième URL :

RewriteEngine on
RewriteRule ([0-9]+)/([0-9]+)$ /photo.php?album=$1&id=$2

2) Réécrire conditionnelle

Il est possible de conditionner la réécriture des URL, afin notamment d'effectuer des tests sur certains paramètres avant de réécrire les URL.
Les utilisations les plus courantes sont : bannir un domaine (ou une adresse IP) de votre site, protéger vos dossiers images et encore bien d'autres.

La syntaxe est la suivante :

RewriteEngine on
RewriteCond TEST VALEUR
RewriteRule ACTION


Exemples :
Bannir les utilisateurs venant d'un domaine spécifique :

RewriteEngine on
RewriteCond %(HTTP_REFERER) ^http://(www.)?domaine_a_bannir.com
RewriteRule .* http://www.google.fr [L]

[L] est un "drapeau" qui signifie que cette réécriture sera la dernière. Tout ce qui se trouve après ne sera pas exécuté.

Rediriger les utilisateurs d'Internet Explorer (par exemple)
On va rediriger tous les utilisateurs de ce pas beau Internet Explorer vers le site de Mozilla

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule .* http://www.mozilla.org [L]

Quelques masques à connaître
  • %(HTTP_USER_AGENT) ==> Contient notamment le navigateur et le système d'exploitation
  • %(HTTP_REFERER) ==> La page (si elle est renseignée) d'où vient votre visiteur
  • %(HTTP_HOST) ==> Le domaine
  • %(REQUEST_FILENAME) ==> La page qui a été demandée
  • %(REMOTE_ADDR) ==> L' adresse IP

Je tiens à remercier tout particulièrement Fabrice Lezoray pour la seconde partie de ce tuto.

Partie 2 >> URL Rewrite et mise en cache

ADAM Benjamin 2008 | Admin