L'URL Rewrite
L'URL Rewrite permet, comme son nom l'indique de "réécrire" des URL.
Cette méthode permet donc de transformer des URL du type "http://www.mon_site.be/page.php?id=18&arga=26&argb=32"
en quelque chose du genre "http://www.mon_site.be/page-18-16-32.html".
Quel en est l'intérêt?
L'intérêt vient en fait du référencement; les moteurs de recherche comme Google ont du mal à indexer toutes
les variables passées en argument (?id=18&arga....).
L'URL Rewrite modifiera donc l'URL de vos pages pour faciliter la vie des robots. De plus, les arguments
dans une URL sont des failles de sécurité pour votres site. L'URL Rewrite les comblera.
L'URL Rewrite ne fonctionne pas sur tous les hébergeurs.
Vérifiez dans la liste des fonctionnalités disponibles si celui-ci accepte les fichiers ".htaccess" ainsi
que l'URL Rewrite.
Si vous possédez votre propre serveur (ou un serveur local
tel que WAMP, XAMPP ou MAMP), pour vérifier que l'URL Rewrite est activé, ouvrez le fichier "httpd.conf"
et vérifiez que ces lignes ne sont pas en commentaire (si c'est le cas, enlevez le "#" devant la ligne).
LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
Je n'ai pas vu l'URL Rewrite dans la liste des
fonctionnalités disponibles, comment être sûr que celui-ci fonctionne?
Il n'y a pas 36 solutions, il va falloir tester. Créez un fichier nommé "url_rewrite.php" et mettez-y
les balises de base ainsi que quelques lignes de texte.
Rajoutez ces lignes dans votre fichier .htaccess (si vous n'en avez pas, créez-en un).
RewriteEngine on
RewriteRule ^page\.html$ /url_rewrite.php [L]
Ne vous inquiètez pas de ces lignes, vous les comprendrez plus tard.
Uploadez ces fichiers sur votres site et allez à la page "page.html" (qui n'existe pas). Si vous voyez
le contenu de "url_rewrite.php", c'est réussi, sinon, c'est que votre hébergeur n'accepte pas l'URL Rewrite.
Le code Apache
Le code contenu dans le fichier .htaccess est appellé
"Apache" du nom du serveur PHP, Apache.
Avant toute instruction de réécriture d'URL, vous devez taper cette ligne qui sert à lancer le moteur
de réécriture d'URL d'Apache:
RewriteEngine on
Si vous oubliez d'indiquer cette ligne, l'URL Rewrite ne fonctionnera pas
Il n'est nécessaire d'écrire cette ligne qu'une seule fois
dans le fichier.
RewriteRule
RewriteRule est le mot-clé qui va permettre de faire une réécriture d'URL.
Voici sa syntaxe:
RewriteRule ^ancienne_page$ /nouvelle_page [L]
ancienne_page est le nom de l'ancienne page, celle dont l'URL va être réécrite.
nouvelle_page est l'URL qui va être réécrie.
[L] est un drapeau (une option) qui signifie "Last", il indique au serveur qu'il doit
s'arrêter si l'URL correspond au shéma de la règle (si la règle est bonne, le serveur ne vérifie pas
les autres possiblibilités. Il est facultatif mais peut être intéressant pour économiser 0,000000001%
du CPU (puissance du processeur) du serveur.
Le nom de l'ancienne page doit être précédée d'un "^"
et doit se terminer par "$".
Donc je dois taper le nom de toutes mes pages et leur
nom de remplacement???
Non, il y a moyen de si simplifier la vie avec des expressions régulières. Celles-ci permettent en effet
d'écrire de nombreux caractères en abrégé.
Admettons que vous avez de nombreuses pages en ".php3" et que vous aimeriez qu'elles soient réécrites en
".php". Voici ce qu'il faudra taper:
RewriteRule ^([0-9a-zA-Z-]+)\.php$ /$1.php3 [L]
([0-9a-zA-Z-]+) indique que l'on peut prendre tous les caractères possibles et imaginables et ce, autant
de fois que l'on veut (le "+" réprésente "pas de limite dans le nombre de caractères").
Vous devez "échapper" tous les points présents dans
votre URL (metre un "\" devant).
$1.php3 indique que l'on sélectionne tout ce qu'il y a avant le ".php3" et qu"on le met à la place de
la première parenthèse capturante (([0-9a-zA-Z-]+)).
Cette petite ligne de code va donc réécrire l'URL de toutes vos pages ".php3" en ".php".
Reprenons donc l'exemple du début.
Pour transformer "http://www.mon_site.be/page.php?id=18&arga=26&argb=32" en "http://www.mon_site.be/page-18-26-32.html", il
faudra taper ceci:
RewriteRule ^([0-9a-zA-Z-]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1.php?id=$2&arga=$3&argb=$4 [L]
([0-9]+) ne capture que les chiffres. (De 0 à 19, autant de fois que l'on veut).
Comme vous avez pu le remarquer, toutes les parenthèses capturantes sauf la première n'acceptent que des
chiffres, ce qui interdit au hacker d'y introduire du code malicieux.
N'oubliez pas de changer le lien vers les pages dont l'URL à été réécrite.
Les réécritures conditionnelles
L'URL Rewrite permet aussi l'usage de condition. On pourra donc écrire
"Réécrit l'URL X en Y si le
visiteur est sur FF"
Les conditions ne peuvent concerner que des paramètres
du côté CLIENT.
La syntaxe de la réécriture conditionnelle est la suivante:
RewriteCond %(CONDITION) CONDITION
RewriteRule .* URL [L]
Voici la liste des différentes conditions qui peuvent être utilisées:
- %(HTTP_USER_AGENT):navigateur + OS (système d'exploitation)
- %(HTTP_REFERER):précédente page visitée
- %(HTTP_HOST): le domaine
- %(REQUEST_FILENAME): le nom du fichier demandé
- %(REMOTE_ADDR): l'adresse IP du visiteur
Au final, on peut donc faire des choses très amusantes avec l'URL Rewrite. Par exemple:
RewriteCond %(HTTP_REFERER) ^http://www.microsoft.com$
RewriteRule .* http://www.kubuntu-fr.org [L]
Ce petit code va rediriger tous les visiteurs venant du site de microsoft sur le site de Kubuntu.
(Kubuntu est une distribution gratuite de Linux).
Dans le même genre, on peut faire:
RewriteCond %(HTTP_USER_AGENT) MSIE
RewriteRule .* http://www.firefox.com [L]
Ce code va rediriger tous les utilisateur de Microsoft Internet Explorer sur le site de Firefox.