Mod_Rewrite

Document Sample
Mod_Rewrite Powered By Docstoc
					Mod_Rewrite
Le « couteau-suisse »




          La réécriture d’URLs
          au service du
          référencement.
Attention aux pièges !

   Il y aura obligation de modifier les sources de vos
    pages web, pour générer en interne le nouveau
    format d’URLs.

    - suppose certaines compétences en programmation


   Il faut donc bien réfléchir avant de se lancer dans
    l’aventure et planifier le travail à effectuer !
Réfléchissons ensemble …

   Quel serait le gain espéré ?

    - Peut-on espérer un meilleur positionnement du site ?
    - Peut-on espérer avoir plus de pages indexées ?
    - Mon PageRank peut-il augmenter ?


   Quel est le format actuel des URLs ?

    - combien de variables a-t-on dans l’URL ?
    - ce nombre peut-il varier ? (quantité, ordonnancement…)
    - la génération des URLs est-elle centralisée dans le code ?
Quelques cas d’utilisation


   Voyons ensemble quelques cas d’utilisation de
    mod_rewrite qui permettront une meilleure
    compréhension du mécanisme de la réécriture
    d’URLs.
Quelques cas d’utilisation


   Voyons ensemble quelques cas d’utilisation de
    mod_rewrite qui permettront une meilleure
    compréhension du mécanisme de la réécriture
    d’URLs.


    Posons notre première ligne :

             RewriteEngine On
Un nom « canonique »

• Vous souhaitez que vos pages soient
  toujours accédées sous :

  http://www.example.com/*

  plutôt que


  http://example.com/*
Un nom « canonique »

 RewriteEngine On
 RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
 RewriteCond %{HTTP_HOST} !^$
 RewriteRule ^/(.*) http://www.example.com/$1 [L,R]
Un nom « canonique »

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
    RewriteCond %{HTTP_HOST} !^$
    RewriteRule ^/(.*) http://www.example.com/$1 [L,R]

Explication des règles :

•   Si le nom du HOST n’est pas www.example.com
•   Et si le nom du HOST n’est pas « vide » ou « indéfini » (le AND est
    implicite entre les conditions )

•   … on réécrit l’URL vers www.example.com
En présence de sous-domaines …

   RewriteEngine On
   RewriteCond %{HTTP_HOST} ^example\.com [NC]
   RewriteRule ^/(.*) http://www.example.com/$1 [L,R=301]
En présence de sous-domaines …

        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^example\.com [NC]
        RewriteRule ^/(.*) http://www.example.com/$1 [L,R=301]

Dans ce cas, on vérifie simplement si le domaine demandé est
  example.com et nous n’avons de ce fait plus de raison de tester un
  nom de domaine « vide ».

Notez la disparition du signe « ! » qui avait pour effet d’inverser le test.

•  Si le domaine est example.com
Alors
•  On réécrit l’URL vers www.example.com/* avec une entête 301
    Ce que l’on retiendra pour l’instant …


•    Les notations $1,$2…$9 sont des « références-arrières » qui
     correspondent aux expressions mises entre parenthèses en premier
     argument de la règle.
    Ce que l’on retiendra pour l’instant …


•    Les notations $1,$2…$9 sont des « références-arrières » qui
     correspondent aux expressions mises entre parenthèses en premier
     argument de la règle.

•    Les drapeaux en fin de règle qui permettent d’affiner le comportement
     de celle-ci (R [=301],NC,L,QSA…)
    Ce que l’on retiendra pour l’instant …


•    Les notations $1,$2…$9 sont des « références-arrières » qui
     correspondent aux expressions mises entre parenthèses en premier
     argument de la règle.

•    Les drapeaux en fin de règle qui permettent d’affiner le comportement
     de celle-ci (R [=301],NC,L,QSA…)

•    Les variables serveur les plus courantes que l’on peux tester en cas de
     réécriture conditionnelle (HTTP_HOST, HTTP_USER_AGENT,
     HTTP_REFERER, REMOTE_ADDR, SCRIPT_FILENAME,
     QUERY_STRING …)
    Ce que l’on retiendra pour l’instant …


•    Les notations $1,$2…$9 sont des « références-arrières » qui
     correspondent aux expressions mises entre parenthèses en premier
     argument de la règle.

•    Les drapeaux en fin de règle qui permettent d’affiner le comportement
     de celle-ci (R [=301],NC,L,QSA…)

•    Les variables serveur les plus courantes que l’on peux tester en cas de
     réécriture conditionnelle (HTTP_HOST, HTTP_USER_AGENT,
     HTTP_REFERER, REMOTE_ADDR, SCRIPT_FILENAME,
     QUERY_STRING …)

•    Les caractères ^ et $ qui permettent de définir les limites de l’expression
Un exercice … pas très compliqué !

Énonçons ces conventions :
• Un point décimal « . » signifie n’importe quel caractère
• Un signe « * » signifie zéro ou plusieurs instances de ce qui précède
   comme le signe « + » signifie au moins une instance.
• Un signe « ? » marque l’élément qui le précède comme facultatif
• Un signe « | » signifie OU (logical OR)
• Les parenthèses permettent de grouper les éléments
Un exercice … pas très compliqué !

Énonçons ces conventions :
• Un point décimal « . » signifie n’importe quel caractère
• Un signe « * » signifie zéro ou plusieurs instances de ce qui précède
   comme le signe « + » signifie au moins une instance.
• Un signe « ? » marque l’élément qui le précède comme facultatif
• Un signe « | » signifie OU (logical OR)
• Les parenthèses permettent de grouper les éléments

Que peut donc signifier cette simple règle ?

     RewriteRule .+\.(gif|jpe?g|png|css|js)$ - [L]
La réponse est …

      RewriteRule .+\.(gif|jpe?g|png|css|js)$ - [L]
• Une chaîne aléatoire comprenant au moins un caractère : .+
• Suivie d’un point décimal : \.
• Suivie d’un groupe de lettres comprenant gif, jpg, jpeg, png, rss ou js
• Ne sera pas réécrite : - (ça c’était nouveau !)
• Ensuite on quitte le mécanisme pour cette expression : [L]
La réponse est …

      RewriteRule .+\.(gif|jpe?g|png|css|js) - [L]
• Une chaîne aléatoire comprenant au moins un caractère : .+
• Suivie d’un point décimal : \.
• Suivie d’un groupe de lettres comprenant gif, jpg, jpeg, png, rss ou js
• Ne sera pas réécrite : - (ça c’était nouveau !)
• Ensuite on quitte le mécanisme pour cette expression : [L]

En résumé: cette règle évite la réécriture pour les fichiers images,
Javascript et css !

                          Pourquoi donc ?
Une règle qui ne fait rien ?

Nous avons vu dans l’exemple précédent une règle « inutile » qui
  ne fait rien.

Pourquoi dire à mod_rewrite de « ne rien faire »?

Tout simplement pour éviter de passer à travers un « chapelet »
  de règles pour les fichiers qui ne doivent pas être réécrits.
Cela permet d’économiser les ressources du serveur si on met
  cette règle au début du fichier .htaccess

Il faut toujours garder ces « économies » à l’esprit !
Jour ou nuit ?

Si vous souhaitez présenter des pages différentes
   selon l’heure de la visite, c’est très simple à mettre
   en place :

        RewriteEngine on
        RewriteCond %{TIME_HOUR}%{TIME_MIN} >0800
        RewriteCond %{TIME_HOUR}%{TIME_MIN} <2000
        RewriteRule ^index\.html$ index.jour.html [L]
        RewriteRule ^index\.html$ index.nuit.html [L]


 Attention: les conditions sont enchaînées avec un « OU » logique et
 ne s’appliquent qu’à la première règle qui les suit.
Pour plus de clarté …

       RewriteEngine on

       RewriteCond %{TIME_HOUR}%{TIME_MIN} >0800
       RewriteCond %{TIME_HOUR}%{TIME_MIN} <2000
       RewriteRule ^index\.html$ index.jour.html [L]

       RewriteRule ^index\.html$ index.nuit.html [L]

Ceci ne présente aucune différence avec la règle de la page
précédente, mais les lignes vides permettent de mieux visualiser la
logique des réécritures.

Prenez tout de suite de bonnes habitudes !
Contrer les « voleurs d’Images » ?

Votre site est riche d’images et vous ne voulez plus
  que les squatteurs du Web s’en emparent et les
  affichent sur leurs sites.

  RewriteCond %{HTTP_REFERER} !^$
  RewriteCond %{HTTP_REFERER} !^http://www.example.com/.*$ [NC]
  RewriteRule .*\.(gif|jpe?g|png)$ - [F]
Contrer les « voleurs d’Images » ?

Votre site est riche d’images et vous ne voulez plus
  que les squatteurs du Web s’en emparent et les
  affichent sur leurs sites.

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


 Si le référant est défini et s’il est différent de http://www.example.com/*
 on réécrit toutes les images en présentant une entête 403 [F].
Bloquer les robots indélicats ?

Certains robots sont vraiment envahissants et peu
  respectueux du fichier robots.txt, autant leur interdire
  l’accès au site.

 RewriteCond %{HTTP_USER_AGENT}   Gigabot [NC,OR]
 RewriteCond %{HTTP_USER_AGENT}   Xenu\ Link\ Sleuth [NC,OR]
 RewriteCond %{HTTP_USER_AGENT}   HTTrack [NC,OR]
 RewriteCond %{HTTP_USER_AGENT}   PhpDig [NC,OR]
 RewriteCond %{HTTP_USER_AGENT}   WebCopier [NC,OR]
 RewriteRule .* - [F]
Redirection interne ou externe ?

Il y a une différence importante entre :
            RewriteRule ^ancien\.html$ nouveau.html

                                  et

          RewriteRule ^ancien\.html$ nouveau.html [R]

Elle ne se verra qu’au niveau de l’adresse apparaissant dans la barre du
navigateur.
La première expression affichera ancien.html, alors que la seconde
affichera nouveau.html grâce à la redirection externe due au drapeau [R].
A vous de définir l’adresse qui sera affichée par le navigateur !
L’utilisation de RewriteMap

On peut facilement interdire l’accès à une liste de hosts ou d’IPs

RewriteMap hosts-deny txt:/chemin/vers/fichier/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]


Avec le fichier hosts.deny suivant :

 193.102.180.41 -
 bsdti1.sdm.de -
 192.176.162.40 -
 66.249.65.207 -
L’utilisation de RewriteMap

On peut facilement interdire l’accès à une liste de hosts ou d’IPs

RewriteMap hosts-deny txt:/chemin/vers/fichier/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]


Avec le fichier hosts.deny suivant :

 193.102.180.41 -             Attention : Le fichier hosts.deny n’est pas une liste,
                              mais une « map ». Il faut donc impérativement qu’il
 bsdti1.sdm.de -
                              contienne un second argument, même si comme ici
 192.176.162.40 -             il n’a pas de signification particulière ! Mod_rewrite
 66.249.65.207 -              l’analysera en recherchant des couples clé-valeur.
L’utilisation de RewriteMap

On peut facilement interdire l’accès à une liste de hosts ou d’IPs
RewriteMap hosts-deny txt:/chemin/vers/fichier/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]


Avec le fichier hosts.deny suivant :

 193.102.180.41 -           Attention : Le fichier hosts.deny n’est pas une liste,
                            mais une « map ». Il faut donc impérativement qu’il
 bsdti1.sdm.de -
                            contienne un second argument, même si comme ici
 192.176.162.40 -           il n’a pas de signification particulière ! Mod_rewrite
 66.249.65.207 -            l’analysera en recherchant des couples clé-valeur.


                     Faites très attention aux adresse que vous renseignez !
L’impact sur le référencement

Une URL réécrite peut contenir des mots clés utiles au référencement :
           http://www.lisons.info/Hayes-Billy-auteur-46.php


Pour retrouver facilement la fiche de l’auteur de « Midnight Express »,
portant le numéro 46, de même que celles de tous les auteurs de la base,
il suffit d’une règle de réécriture simple:

       RewriteRule auteur-([0-9]+)\.php auteur.php?id=$1 [QSA,L]
L’impact sur le référencement

Une URL réécrite peut contenir des mots clés utiles au référencement :
           http://www.lisons.info/Hayes-Billy-auteur-46.php


Pour retrouver facilement la fiche de l’auteur de « Midnight Express »,
portant le numéro 46, de même que celles de tous les auteurs de la base,
il suffit d’une règle de réécriture simple:

       RewriteRule auteur-([0-9]+)\.php auteur.php?id=$1 [QSA,L]


Le résultat ne se fait pas attendre bien longtemps ….
C’est magique, non ?
C’est fini pour aujourd’hui !

Vous en avez tous suffisamment découvert aujourd’hui pour vous lancer
avec prudence dans la réécriture d’URLs.
La documentation sur ce sujet est abondante, mais peu d’articles
existent en langue française.
Quelques articles sont accessibles sur Webmaster-Hub, notamment
« Mod_rewrite, ou la réécriture d’URLs à la volée », ou encore « La
réécriture d’URLs récursive » que nous aborderont très certainement
une prochaine fois…
Ils vous permettront de plonger plus avant dans ce sujet passionnant !

Merci à tous !

				
DOCUMENT INFO
Shared By:
Categories:
Stats:
views:23
posted:3/19/2011
language:French
pages:32