Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bienvenue dans mon premier tuto sur l'URL Rewriting.
Mais qu'est-ce-que c'est que ce truc ?
C'est une méthode permettant de rediriger votre visiteur. Bon ok, je suis sûr que vous ne m'avez pas compris donc je vais vous donner un exemple.
Quand vous tapez
www.monsite.com/news-7-8.html , vous tombez sur
www.monsite.com/news.php?id=7&comm=8 .
C'est plus clair comme ça ?
Cela sert juste à rediriger, en aucun cas cela ne remplace l'adresse que vous avez dans la barre de liens (pas comme le SdZ, quoi

). Pour faire ça, ce n'est plus de l'URL Rewriting mais il faut faire un système de mise en cache des pages PHP, c'est un peu compliqué et je ne sais pas faire, donc on va rester à l'URL Rewriting.
Et comment peut-on bien faire ça ?
C'est que je vais vous expliquer dans ce tuto

.
Attention, la méthode que je vais vous expliquer n'est pas compatible avec tous les hébergeurs, désolé ! Il existe cependant d'autres méthodes plus compliquées au cas où la mienne ne marcherait pas ; pour les trouver, Google est votre ami !
C'est partiiiiii !
L'utilité
En effet, si je vous le présente de cette manière, je doute que vous compreniez l'utilité de l'URL Rewriting.
C'est très simple, les moteurs de recherche ont du mal à indexer les adresses "exotiques", c'est-à-dire les adresses genre news.php?id=8&comm=7. Google, par exemple, ne va pas plus loin que deux variables après le *.php. Donc, si vous avez plein de pages comme ça sur votre site, vous allez avoir du mal à la référencer. C'est là que l'URL Rewriting intervient.
Le fonctionnement
Cela se fait grâce à un
.htaccess, que vous placez à la racine de votre site. Il faut utiliser le
mod_rewrite d'Apache. Le problème, c'est qu'il n'est pas activé partout, d'où le message en rouge dans l'introduction.
Avant de faire quoique ce soit, vérifions que le
mod_rewrite est activé.
Si vous avez un serveur dédié, ouvrez le fichier
httpd.conf situé dans le répertoire d'Apache et vérifiez que ces deux lignes ne sont pas des commentaires (un # indique un commentaire) :
Code : Apache1
2 | LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c
|
Si elles en sont, effacez simplement le #

.
Sinon, on va vérifier s'il est activé. Pour ce faire, créez un fichier
essai.php à la racine de votre site et mettez-y n'importe quoi dedans. Ensuite, créez un fichier
.htaccess (
htaccess.txt et vous le renommerez une fois sur le serveur, vu que Windows n'aime pas les fichiers commençant par un .) et mettez les lignes suivantes dedans :
Code : Apache1
2 | RewriteEngine on
RewriteRule ^essai\.html$ /essai.php [L]
|
(Je vous expliquerai ces lignes plus tard.)
Si vous avez déjà un .htaccess à la racine de votre site, rajoutez-y ces lignes, n'en faites pas un autre.
Une fois le
.htaccess et le fichier
essai.php sur votre serveur, allez à
http://www.votresite.com/essai.html.
Maintenant, il y a deux possibilités :
- soit vous voyez le contenu de essai.php, ce qui signifie que le mod_rewrite est activé, donc on peut continuer ;
- soit ça affiche une erreur, ce qui signifie que le mod_rewrite n'est pas activé et que vous ne pouvez malheureusement pas continuer ce tuto
. Retirez immédiatement le .htaccess de votre serveur.
Maintenant, place aux choses sérieuses !
La théorie
Voilà, on y est enfin !
Donc, pour commencer, je vais vous expliquer le code de tout à l'heure.
Code : Apache1
2 | RewriteEngine on
RewriteRule ^essai\.html$ /essai.php [L]
|
La première ligne,
RewriteEngine on, veut dire qu'on active le
mod_rewrite d'Apache. C'est la ligne la plus importante, sans elle, rien ne marche

.
La seconde ligne maintenant.
RewriteRule signifie qu'on va définir une règle de redirection (ici,
essai.html devient
essai.php).
^essai\.html$ est une expression régulière (REGEX -M@teo en parle dans son cours de PHP, vous devriez lire la partie sur les REGEX, ça vous servira). Ce n'est pas très compliqué à comprendre : l'URL réécrite doit être entre
^ et
$. Ensuite, il suffit d'écrire le nom de l'URL réécrite. Enfin, le
[L] est un flag qui signifie que cette 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.
Il faut échapper le(s) point(s) avec un \ sinon ça bugue.
Pour finir, le
/essai.php est l'URL de la page dont l'url doit être réécrite.
Je vous conseille de mettre le chemin absolu de cette page parce que certains hébergeurs la demandent.
Voilà ! Bon ok, pour votre site, ça ne servira pas à grand chose mais bon, je vais maintenant vous donner un code bien plus pratique qui réécrit toutes vos pages en
*.php en
*.html. Si vous avez bien compris les REGEX, vous devriez pouvoir le trouver tout seuls.
Code : Apache1 | RewriteRule ^([0-9a-zA-Z-]+)\.html$ /$1.php [L]
|
Pas de panique, je vous explique les changements.
([0-9a-zA-Z-]+) est une REGEX qui signifie n'importe quelle lettre et n'importe quel nombre autant de fois qu'on veut. Elle doit être entre parenthèses. De l'autre coté, le
$1 est le nom de votre page
*.php (sans extension) qui va être réécrite exactement de la même manière en
*.html. Les parenthèses indiquaient que c'était
$1 qu'on modifiait.
Bref, avec ce
RewriteRule,
index.html renvoie sur
index.php,
liste-news.html renvoie sur
liste-news.php, etc.
Et les URL exotiques dans tout ça ?
J'allais justement y venir

.
C'est la même chose que tout à l'heure, mais avec plus de variable (
$1,
$2).
Un exemple ?
Code : Apache1 | RewriteRule ^news-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /news.php?idnews=$1&comm=$2&id=$3 [L]
|
Vous êtes toujours là ?
J'vous explique, ne vous inquiétez pas

.
Tout d'abord, l'url qu'on veux réécrire est du modèle :
/news.php?idnews=$1&comm=$2&id=$3 ;
où
$1,
$2 et
$3 sont les valeurs de
idnews,
comm et
id.
Donc, à la place de l'url qu'on veut réécrire, on met ça. De l'autre coté, on marque tout d'abord la forme d'URL qu'on veut (ici
news-$1-$2-$3.html mais vous pouvez faire autrement si ça vous chante

) et on remplace
$1,
$2 et
$3 par n'importe quel nombre autant de fois qu'on veut (REGEX).
Évidemment, on peut très bien mettre des lettres au lieu des chiffres : dans ce cas, faites comme tout à l'heure ( ([a-zA-Z0-9-]+) ).
Si vous voulez combiner les deux exemples que je vous ai montrés ou en rajouter d'autres, mettez d'abord le(s) spécifique(s) à une page, et ensuite le général (donc le deuxième en premier).
Exercices
Vous avez tout compris ? Vous en êtes sûrs ? Prouvez-le moi !

Je vais donc vous donner quelques exercices pour vous entraîner et devenir un champion en URL Rewriting

.
Premier exercice :
Écrivez-moi la règle réécrivant tous les liens de votre site de la forme
XXXX.php?var1=1&var2=3 en
XXXX-1-3.html.
Simple, nan

?
Solution :
Secret (cliquez pour afficher)Code : Apache1 | RewriteRule ^([a-zA-Z0-9-]+)-([0-9]+)-([0-9]+)\.html$ http://www.monsite.com/$1.php?var1=$2&var2=$3
|
Vous aviez trouvé ? Cela se passe d'explications, si vous ne comprenez pas, relisez la partie
Théorie. J'ai seulement fait un mix entre les deux exemples.
Deuxième exercice :
Écrivez-moi la règle permettant de réécrire
forum.php?page=showtopic&id=1558 en
forum/topic-1558.html.
Vous êtes encore en vie ?

Moi je ne vois aucune difficulté, vous en voyez, vous ?
Secret (cliquez pour afficher)Code : Apache1 | RewriteRule ^forum/topic-([0-9]+)\.html$ http://www.monsite.com/forum.php?page=showtopic&id=$1
|
Bien plus simple que ça en à l'air, nan ?
Bannir un nom de domaine
Grâce à l'URL Rewriting, on peut aussi bannir les utilisateurs provenant d'un nom de domaine spécifique et ensuite les rediriger sur un autre site.
Exemple :
Code : Apache1
2
3 | RewriteEngine on
RewriteCond %(HTTP_REFERER) ^http://(www.)?ledomaineabannir.com
RewriteRule .* <lien url="http://www.osef.tk">http://www.osef.tk</lien> [L]
|
Si votre domaine est celui indiqué, vous êtes redirigés sur le site indiqué dans la
RewriteRule.
Empêcher de se faire piquer les images de son site
Ce petit script que je vais vous présenter est très utile : il empêche les autres sites de piquer vos images et de vous voler de la bande passante. Il est assez simple à comprendre.
Code : Apache1
2
3
4 | RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.votresite.com/.*$ [NC]
RewriteRule .*\.(gif|png|jpe?g)$ - [F]
|
On compare le nom de domaine où l'on voit l'image et le vôtre. Si c'est le même, on affiche l'image, sinon on affiche une erreur 403 (interdiction d'accéder à cette page). Le flag
[NC] veut dire que cette ligne n'est pas sensible à la casse (IMAGE.jpg, image.jpg, ImAgE.JpG, etc. marchent tous). Le flag
[F] renvoie une erreur 403 si les conditions sont bonnes (nom de domaine où l'on voit l'image différent du vôtre).
Bannir les utilisateurs d'un navigateur
Ou encore, un truc encore plus fun, on peut bannir les utilisateurs d'un certain navigateur et les rediriger sur un autre site. Un petit exemple qui me fait bien marrer

:
Code : Apache1
2
3 | RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule .* <lien url="http://www.mozilla.org">http://www.mozilla.org</lien> [L]
|
MSIE = Internet Explorer

.
Méchant, nan ?