Le module mod_rewrite
Apache se souvient des modèles, ou groupes passés dans les règles de réécriture, et on peut les rappeler grâce à la directive $N, avec (0 <= N <= 9).
Apache se souvient aussi des derniers ordres passés dans les conditions de réécriture, et on peut les rappeler grâce à la directive %N, avec (0 <= N <= 9).
Un exemple concret :
RewriteCond %{HTTP_HOST} ^(www\.)+mamemeamoi\.(com|fr) [NC]RewriteCond %{REQUEST_URI} ^(.*)\.php$ [NC]RewriteRule ^/(.*) /$1?IDP=mameme [PT,QSA,S=4]
Traduit en clair, cela signifie :
- Si on vient ici à partir d’une adresse telles que
www.mamemeamoi.comou encorewww.mamemeamoi.frvoiremamemeamoi.fralors c’est bon on continue les conditions pour la règle à venir - Si on demande à voir une page qui se termine par
phpalors c’est bon on continue les conditions pour la règle à venir - Si on est arrivé jusqu’ici c’est que toutes les conditions ont été validées => on applique la règle qui est, traduite en Français :
^/(.*) /$1?IDP=mameme: on ajoute à l’URI, quelle qu’elle soit, les paramètresIDP=mameme;- Directive
[PT]: on applique cette URI en interne de manière à faire croire à tout ce qui suit, y compris une fois que les règles de réécriture sont terminées, que c’est vraiment cette adresse qui a été demandée, donc les autres modules agiront aussi en conséquence ; - Directive
[QSA]: sur l’URI appliquée, on y fait suivre les paramètres qui se trouvaient après le?, les paramètres_GETenphp. Par exemple si on a demandé/t.php?i=3, on se retrouve avec l’URI finale/t.php?i=3&IDP=meme, alors que sans la directiveQSA, on se retrouve avec l’URL finale/t.php?IDP=meme; - Directive
[S=4]: on demande de sauter les 4 règles de réécriture qui suivent, et on appliquera celles qu’il y a après (s’il y en a).
Maintenant, voyons si on avait changé la règle de réécriture par :
RewriteCond %{HTTP_HOST} ^(www\.)+mamemeamoi\.(com|fr) [NC]RewriteCond %{REQUEST_URI} ^(.*)\.php$ [NC]RewriteRule ^/(.*) /%1%2/$1
Regardez bien : il y a le sigle %1 mais aussi le sigle $1. En réalité le %1 est remplacé par ce qu’il y a dans les parenthèses rencontrées dans la condition de réécriture. Et en partant de la première condition ! A l’inverse, le $1 est remplacé par ce qu’il y a dans les parenthèses rencontrées dans la règle de réécriture. Ainsi si on demande l’URI http://www.mamemeamoi.com/popo.php, elle sera transformée en http://www.com/popo.php, et si on demande l’URI http://mamemeamoi.com/popo.php, elle sera transformée en http://com/popo.php. Ce qui ne sert à rien d’autre que de montrer un exemple. Mais imaginez ce que vous pouvez faire !