TUTORIELS 
Le fichier .htaccess (1) : mod_ rewrite

Page 1 | 2

Focus sur ce petit bout de texte bien utile pour Apache et ses modules. On commence avec l'application de règles de réécriture.
 (19 septembre 2003)
 

Exemple : prévenir le "hot linking" de fichier.
Certains internautes volent sans le savoir la bande passante que payent les webmasters, en utilisant les images d'un site sur un autre site via le lien absolu, c'est à dire en allant directement chercher l'image sur le site d'origine plutôt que de le stocker sur son propre site. Certains hébergeurs gratuits ont mis en place une parade affichant en lieu et place de l'image liée, une publicité pour le site. Nous vous expliquons ici comment interdire simplement "l'export" de vos images, et comment intervertir l'image volée par une autre choisie.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.site.com/.*$ [NC]
RewriteRule .*\.(gif|jpe?g?|png)$ - [NC,F]

Renvoyer vers une image précise n'est guère plus compliqué :

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.site.com/.*$ [NC]
RewriteRule .*\.(gif|jpe?g?|png)$ /pub.gif [NC]

Expliquons pas à pas...
RewriteEngine on met donc en route notre moteur de réécriture. Suivent deux conditions de réécriture RewriteCond : si la chaîne HTTP_REFERER n'est pas vide (le visiteur peut venir directement voir l'image, ou être derrière un proxy), et si elle contient autre chose que la racine de votre site (donc, si la requête est envoyée depuis un autre site). Tout ceci est déterminé à l'aide des expressions rationnelles :
! marque la négation de ce qui va suivre : !(jdnet) donne "ne contient pas jdnet".
^ marque le début d'une chaîne : ^net peut reconnaître "netissimo", tandis que net seul peut reconnaître "jdnetdev" .
.* : le point correspond à "n'importe quel caractère, même vide", et l'étoile signifie "le caractère précédant autant de fois que possible". L'association des deux donne donc "n'importe quelle chaîne de caractères, même vide", et reconnaîtra autant index.php?id=7&rub=13 que default.aspx.
Le signe $ marque la fin d'une chaîne : aucun caractère ne peut suivre celui-ci.
Le drapeau [NC], enfin, indique qu'on ne doit pas prendre en compte la casse : ce motif est valable autant pour "www.site.com" que "WWW.Site.Com".
Troisième directive, RewriteRule précise à quelle partie de la requête s'applique notre réécriture. Nous faisons une fois de plus appel aux expressions rationnelles pour que notre règle ne s'applique qu'aux requêtes portant sur les fichiers GIF, JPG, JPE, JPEG ou PNG.
Nous retrouvons le couple .*, qui indique que le fichier peut porter n'importe quel nom. Suit le couple \. : on veut réellement tester ici le point de l'extension de fichier, et non "n'importe quel caractère". L'anti-slash ("\") qui le précède permet donc d'annuler la "spécificité" du point, et d'en faire un simple caractère plutôt qu'un motif. Enfin, (xx|yy|zz) permet de dire "xx OU yy OU zz", et le point d'interrogation précise que le caractère qui le précède est optionnel (les lecteurs attentifs noteront que nous incluons donc les fichiers JP dans notre ensemble, ce qui ne saurait poser problème).
Nous proposons donc deux substitutions. La première, - , indique qu'il n'y a pas de réécriture... Mais nous avons deux drapeaux : NC qui retire le problème de casse, et surtout F (pour forbidden) qui, finalement, interdit l'accès aux fichiers reconnus. Ainsi, toute requête extérieure sur ces fichiers se soldera par un "fichier cassé". On pourrait aussi bien utiliser G, pour gone...
La seconde substitution remplace donc tout appel vers une image, n'importe laquelle, vers une image spécifique, pub.gif, située à la racine du serveur.

Voici pour notre première approche de mod_rewrite. D'autres suivront dès la semaine prochaine.

>> Discutez de cet article dans le forum JDNet Développeurs

Page 1 | 2

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page