11
Fiche technique www.phpsolmag.org 2 PHP Solutions N° 6/2006 M od_Rewrite est un module de Apache, installé par dé- faut sur le serveur (quoiqu'il ne soit pas toujours activé dans la configuration). Sa fonction consiste à réécrire (en anglais rewriting ) les adresses URL, autrement dit, à pré- senter les fichiers et les répertoires placés sur la vitrine à l'aide d'autres noms et chemins qu'en réalité. Cette démarche permet notamment de réécrire dynamiquement les liens, de transmettre les variables supplémen- taires aux scripts PHP (via la méthode GET), qui n'ont été ni précisées dans l'adresse [URL] externe ni transmises via la méthode POST ou de bloquer les liens externes (appelés également HotLink ) pour les contenus choisis. Le fonctionnement de Mod_Rewrite repose sur les règles qui décrivent la façon de réécrire les adresses URL à placer par défaut dans le fichier .htaccess . Tout le monde aime les adresses claires et simples des sites Web. Malheureusement, la logique des applications PHP est parfois assez complexe ; quelques arguments transmis en adresse URL sufsent pour rendre difcile la vie des utilisateurs de votre vitrine et réduire son côté attirant pour les moteurs de recherche. Nous résolvons ce problème en utilisant le module Mod_Rewrite : il permet en effet de remplacer un grand nombre de liens et de paramètres entremêlés par des adresses Web claires et conviviales. Peut-on utiliser Mod_Rewrite ? Malheureusement, la plupart des serveurs d'hébergement actuels ne supportent pas le module Mod_Rewrite. Cependant, puisque de plus en plus d'utilisateurs attendent la possibilité de l'utiliser, il est peu à peu proposé en tant que standard. Dans un premier temps, il faut savoir si votre serveur propose ce module ; vous pouvez le demander à l'administrateur ou le vérier vous-mêmes. Pour ce faire, Les adresses URL en PHP : comment mettre mod_rewrite au travail ? Michał Gacki Michał Gacki est programmeur autodi- dacte. Depuis de nombreuses années, il s'intéresse à l'informatique et en par- ticulier, à la programmation qui est sa  pass ion. Il tr avail le da ns un grou pe qu' il a fondé (qui ne s'occupe pas actuellement seulement de l'informatique) portant le nom de Bil Software. Auteur Niveau de difculté :  lll Ce qu'il faut savoir... Des connaissances moyennement avan- cées sur la conguration et l'utilisation du serveur Apache seront utiles. Cet article explique... Nous vous présenterons comme obtenir notamment des liens clairs et protéger l'accès aux chiers à l'aide de Mod_ Rewrite. Nous expliquerons également les notions des expressions régulières.

Les Addresses URL en PHP - Comment Mettre Mod_rewrite Au Travail - 06.2006

Embed Size (px)

Citation preview

  • mod_rewriteFiche technique

    www.phpsolmag.org2 PHP Solutions N 6/2006

    Fiche techniquemod_rewrite

    www.phpsolmag.org 3PHP Solutions N 6/2006

    Mod_Rewrite est un module de Apache, install par d-faut sur le serveur (quoiqu'il ne soit pas toujours activ dans la configuration). Sa fonction consiste rcrire (en anglais rewriting) les adresses URL, autrement dit, pr-senter les fichiers et les rpertoires placs sur la vitrine l'aide d'autres noms et chemins qu'en ralit. Cette dmarche permet notamment de rcrire dynamiquement les liens, de transmettre les variables supplmen-taires aux scripts PHP (via la mthode GET), qui n'ont t ni prcises dans l'adresse [URL] externe ni transmises via la mthode POST ou de bloquer les liens externes (appels galement HotLink) pour les contenus choisis. Le fonctionnement de Mod_Rewrite repose sur les rgles qui dcrivent la faon de rcrire les adresses URL placer par dfaut dans le fichier .htaccess.

    Tout le monde aime les adresses claires et simples des sites Web. Malheureusement, la logique des applications PHP est parfois assez complexe ; quelques arguments transmis en adresse URL suffisent pour rendre difficile la vie des utilisateurs de votre vitrine et rduire son ct attirant pour les moteurs de recherche. Nous rsolvons ce problme en utilisant le module Mod_Rewrite : il permet en effet de remplacer un grand nombre de liens et de paramtres entremls par des adresses Web claires et conviviales.

    Peut-on utiliserMod_Rewrite ?Malheureusement, la plupart des serveurs d'hbergement actuels ne supportent pas le module Mod_Rewrite. Cependant, puisque de plus en plus d'utilisateurs attendent la possibilit de l'utiliser, il est peu peu propos en tant que standard. Dans un premier temps, il faut savoir si votre serveur propose ce module ; vous pouvez le demander l'administrateur ou le vrifier vous-mmes. Pour ce faire,

    Les adresses URL en PHP : comment mettre mod_rewriteau travail ?Micha Gacki

    Micha Gacki est programmeur autodi-dacte. Depuis de nombreuses annes, il s'intresse l'informatique et en par-ticulier, la programmation qui est sa passion. Il travaille dans un groupe qu'il a fond (qui ne s'occupe pas actuellement seulement de l'informatique) portant le nom de Bil Software.

    Auteur

    Niveau de difficult : lll

    Ce qu'il faut savoir...Des connaissances moyennement avan-ces sur la configuration et l'utilisation du serveur Apache seront utiles.

    Cet article explique...Nous vous prsenterons comme obtenir notamment des liens clairs et protger l'accs aux fichiers l'aide de Mod_Rewrite. Nous expliquerons galement les notions des expressions rgulires.

  • mod_rewriteFiche technique

    www.phpsolmag.org2 PHP Solutions N 6/2006

    Fiche techniquemod_rewrite

    www.phpsolmag.org 3PHP Solutions N 6/2006

    ralisez un simple test : crez un fichier test.php o vous placerez le code suivant et l'effectuerez dans le serveur :

    Dans ce script, appelez la fonction php_info() qui prcise les paramtres concernant l'environnement PHP. Si vous utilisez le paramtre INFO_MODULES, seules les informations sur les modules installs doivent s'afficher (Figure 1).

    Si la liste contient le nom mod_rewrite, slectionn sur la Figure 1, vous pouvez tre srs que Mod_Rewrite est install sur votre serveur. Il peut toutefois arriver que la fonction ne retourne pas d'informations sur les modules (cela dpend de la con-figuration du serveur) ; afin de vrifier si Mod_Rewrite est prsent, utilisez donc le script prsent sur le Listing 1 ; placez-le galement sur le serveur sous le nom de test.php. Ensuite, crez un fichier .htac-cess dont le contenu se trouve sur le Lis-ting 2. Le fonctionnement de ce tandem est simple : dfinissez un exemple de rgle Mod_Rewrite dans le fichier .htac-cess ; cette rgle rcrit tous les liens au fichier test.php comme test.php?tester=1 ; ainsi, la variable tester ($tester) avec la valeur 1 affecte est-elle transmise au script test.php et l'ensemble est ensuite test. Si votre script retourne l'information que Mod_Rewrite est absent, vous pouvez demander l'administrateur de l'installer (ou au moins, de le lancer localement).

    N'oubliez pas un autre point : lorsque vous vrifiez si la variable $tester est prsente l'aide de isset($tester), vous supposez que les register_globals sont [actives] dans les param-tres du parseur PHP. Et en fait, elles sont dsactives sur les nombreux serveurs pour des raisons de scurit. Il est donc recommand d'utiliser la construction isset($_GET['tester']) > PHP4.1 ou

    bien isset($HTTP_GET_VARS['tester']) < PHP4.1. Une autre remarque con-cerne la cration du fichier .htaccess sous Windows. Il est impossible de crer le fichier dont le nom commence par un point sous ce systme. Pour ce faire, crez un fichier. Il suffit d'ouvrir le bloc note (dmarrer Excuter : notpad) et d'enregistrer sous .htaccess (choisir type tous fichier et le tour est jou. Vous pouvez galement renomer le fichier sur votre serveur FTP.

    Lorsque vous placez sur le serveur le fichier .htaccess avec les comman-des Mod_Rewrite et que le module ne fonctionne pas, si vous saisissez alors n'importe quelle adresse rcrite du fichier du mme rpertoires que .htaccess, vous verrez un message d'erreur 404 (impos-sible de trouver le fichier) [mal dit, phrase trop long]. D'autres fonctions du rpertoire ne fonctionneront pas ou vous verrez s'af-ficher l'erreur 500 (Internal Server Error). Vous verrez cette deuxime erreur surtout quand le serveur interprtera RewriteRule (et n'importe quelle autre commande mod_rewrite) comme une erreur de syn-taxe .htaccess.

    Si vous n'utilisez pas un serveur d'h-bergement mais votre propre serveur et que la rcriture des liens ne fonctionne pas, alors il faut modifier le fichier de con-figuration principal d' Apache qui s'appelle httpd.conf. Pour ce faire, ouvrez-le dans n'importe quel diteur de texte, trouvez les lignes LoadModule rewrite_module

    modules/mod_rewrite.so, ClearModuleList et AddModule mod_rewrite.c et supprimez les caractres de commentaires (#) par lesquels elles commencent. Il faut ga-lement trouver dans ce fichier la directive AccessFileName qui dtermine le nom du fichier par dfaut, capable de stocker les paramtres dans les rpertoires. .htaccess est le nom par dfaut mais si ce n'est pas le cas, saisissez .htaccess. prsent, il suffit de redmarrer Apache et d'effectuer de nouveau les tests : la rcriture devrait fonctionner.

    Mod_Rewrite : au travailSi vous disposez du module Mod_Rewri-te, vous pouvez passer aux exemples plus avancs de son utilisation. Vous avez vrifi auparavant si la variable transmise au script, l'aide de Mod_Rewrite, existe . Maintenant, vrifiez galement sa valeur (true ou false). Pour ce faire, crez le fichier index.php dont le code est pr-sent sur le Listing 3. N'oubliez pas les register_globals ! Vous auriez aussi be-soin du fichier .htaccess dont le contenu est le suivant :

    RewriteEngine On

    RewriteRule ^index\.php$

    index.php?menu=true [L]

    Voici comment fonctionne l'ensemble index.php-.htaccess : aprs que vous ayez saisi le nom index.php dans le navigateur Internet [confusion inutile], Mod_Rewrite rcrit index.php comme index.php?menu=true ; grce cette d-marche, la variable $menu sera envoye au parseur PHP. Si cette opration russit, vous verrez un message vous informant que la variable $menu existe. La valeur de la variable $menu2 sera aussi change en true (remarquez qu'au dbut du script sa valeur est false, pour qu'il soit impossible

    Figure 1. Modules du serveur Apache dans l'environnement PHP

    Listing 1. Nous vrifions si Mod_Rewrite a t install sur le serveur

    Mod_Rewrite est install sur ce serveur Mod_Rewrite n'est pas install sur le serveur ou bien il est configur

    incorrectement

  • mod_rewriteFiche technique

    www.phpsolmag.org4 PHP Solutions N 6/2006

    de la modifier via la mthode GET) et vous verrez s'afficher le reste du mes-sage. Cette partie est simple, passons donc l'analyse du fichier .htaccess. Premirement, afin de crer des rgles de Mod_Rewrite, il faut placer l'instruction RewriteEngine On qui, comme son nom l'indique, active la rcriture. Ensuite, dfinissez chaque rgle via la commande

    RewriteRule. La syntaxe de cette com-mande se prsente ainsi :

    RewriteRule ^adresse source$ adresse

    rcrite. [DRAPEAUX]

    La premire adresse, adresse source, dont le nom commence toujours par le ca-ractre ^ et se termine par le caractre de

    dollar ($) constitue une masque d'aprs laquelle Mod_Rewrite rcrira l'adresse saisie dans le navigateur comme adresse rcrite. N'oubliez pas que si vous uti-lisez des caractres spciaux dans n'im-porte quelle adresse : un signe de dollar ($), un point (.), un caret (^), une astris-que (*), un plus (+), un point d'interroga-tion (?), une barre oblique inverse (\) ou bien des accolades, des chevrons ({})ou des crochets ([]), il faut les prcder d'un caractre de barre oblique inverse (\). C'est d au fait que les deux chemins sont reconnus l'aide des expressions rgu-lires (en anglais regular expressions) o ces caractres jouent des rles dfinis . Le fait de prcder ces caractres par une barre oblique inverse s'appelle un chappement de caractres (en anglais character escaping). Ceci fait en sorte que chaque caractre spcial qui se trouve di-rectement derrire cette barre est reconnu comme un caractre ordinaire.

    Une autre question concerne les dra-peaux placs derrire les rgles. Nous ne les avons pas employs dans les exemples susmentionns parce qu'ils sont utiles seulement quand vous employez un grand nombre de rgles. Les drapeaux les plus souvent utiliss sont les suivants :

    NC grce ce drapeau, la rgle fonctionnera indpendamment de la taille des lettres (majuscules ou mi-nuscules) utilises pour crire l'adres-se URL. Si vous ajoutiez le drapeau NC l'exemple dcrit, la faon d'crire l'adresse ne serait pas importante, par exemple, INDEX.PHP, inDeX.pHp, IndeX.php, etc.,

    OR signifie la mme chose que or en anglais : ou. Si vous ajoutez ce drapeau la rgle, vous pouvez tre certains que si cette dernire n'est pas excute, le serveur tentera d'uti-liser la rgle qui se trouve une ligne en dessous,

    L abrviation du mot anglais last (dernier). Si vous ajoutez ce drapeau, la vrification de toutes les rgles dans .htaccess est arrte, si la rgle le contenant est correcte et utilise.

    R abrviation de redirect (de l'an-glais redirection). Si vous ajoutez ce drapeau, l'adresse sera redirige l'adresse rcrite. Si vous ajoutiez ce drapeau notre deuxime exemple, la suite ?menu=true serait ajoute la barre d'adresses du navigateur, ce qui

    Expressions rguliresDans les rgles RewriteRule, nous utilisions les expressions rgulires (en anglais regular expressions). Pour simplifier, il s'agit des modles de chanes de symboles, utiliss pour une recherche avance des caractres dans un texte (en ce qui concerne RewriteRule, on recherche dans les noms de fichiers et de rpertoires). Ces expressions trouvent le texte correspondant au modle. Grce leur souplesse, les expressions rgulires cons-tituent un standard parmi les mthodes de recherche de texte. Sachez qu'il existe des syntaxes Unix et Perl (connue comme PCRE : Perl Compatible Regular Expressions et utilise non seulement en Perl mais aussi en PHP, Ruby et d'autres langages, utilisant la bibliothque PCRE, cre en C). Sans connatre au moins les notions des expressions rgulires, il est difficile d'utiliser Mod_Rewrite. Voici quelques points utiliss dans les ex-pressions rgulires qui vous faciliterons le travail avec ce module :

    point (.) n'importe quel caractre, texte1|texte2 alternative : texte1 ou texte2, caret (^ ) commence une zone donne de caractres, dollar ($) termine une zone donne de caractres, point d'interrogation (?) zro ou un caractre prcdant l'expression, astrisque (*) zro ou plusieurs caractres prcdant l'expression, plus (+) un ou plusieurs caractres prcdant l'expression, (texte _ entre _ parenthses) regroupe le texte texte _ entre _ parenthses.

    Afin de placer dans l'adresse cible les noms trouvs, correspondants l'expression de la rgle par rapport l'adresse source, utilisez le signe de dollar ($), indiquant le rsultat de la recherche ; placez le numro de l'expression directement derrire le signe de dollar (le nu-mro se calcule partir la premire expression permettant de saisir le texte), par exemple, $1, $2 et $3. Les numros des rsultats de recherche sont affects chaque expression (contenue entre les parenthses), par exemple, $1, $2 et $3 seront affects l'expression ^([^-]+)/([^-]+)/([^-]+)$.

    Listing 2. Fichier .htaccess que nous utilisons avec test.php pour vrifier si Mod_Rewrite est prsente

    Options +FollowSymLinks

    RewriteEngine On

    RewriteRule ^(test.php)$ test.php?tester=1 [QSA]

    RewriteRule ^$ test.php?tester=1 [QSA]

    Listing 3. Nous vrifions la valeur de la variable j$menu

    La variable $menu existe, quoiqu'elle ne soit pas prcise dans

    l'adresse URL

    Grce la variable prcdente, la valeur de la variable $menu2 a t change

    en true,

    c'est pour cette raison que ce texte est visible.

  • Fiche techniquemod_rewrite

    www.phpsolmag.org 5PHP Solutions N 6/2006

    n'est pas une bonne solution. Lorsque vous employez le drapeau R, vous pou-vez indiquer le type de la redirection, par exemple, vous noterez la redirec-tion 301 (Redirect 301) comme R=301.

    Il est possible d'ajouter plusieurs drapeaux simultanment ; il suffit de les numrer derrire la virgule entre les crochets la fin de la rgle, par exemple : [L,NC,OR].

    Dans l'exemple de cet article, le chemin index.php sera rcrit comme index.php?menu=true. La solution de transmettre les variables est utile quand vous voulez transfrer des valeurs suppl-mentaires sans modifier les fichiers PHP. titre d'exemple, si vous voulez ajouter une promotion votre boutique Internet utilisant les fichiers (et non la base de donnes), il n'est pas ncessaire de modifier chaque fois les fichiers ; il suffit de placer une seule fois la condition approprie dans le script PHP et de charger le fichier .htaccess sur le serveur. la fin de la promotion, il suffit de supprimer .htaccess ou de modifier son nom, par exemple, en promotion.htaccess. Avec de telles solutions, n'oubliez pas que si quelqu'un connat la variable dont dpend la condition, il peut l'ajouter l'adresse URL et entrer ainsi dans la partie cache du site Web !

    RewriteBaseLa commande RewriteBase permet d'in-diquer le rpertoire o se trouvent les fichiers dfinies dans les adresses cibles. Sa syntaxe se prsente ainsi :

    RewriteBase chemin

    titre d'exemple, si vous crez le fichier .htaccess contenant le code :

    RewriteEngine On

    RewriteBase /rpertoire/

    RewriteRule ^index\.html$

    index.php [L]

    et ensuite, vous saisissez index.html dans le navigateur, le contenu du fichier rpertoire/index.php s'affichera. Grce l'utilisation de RewriteBase, vous n'tes plus obligs de dfinir le rpertoire dans la rgle.

    Migration de domaines l'aide de Mod_RewriteIl arrive souvent que vous modifiez le do-maine de votre service et vous souhaitez

    garder l'ancien. titre d'exemple, vous pouvez le transfrer d'un domaine gratuit sur un domaine payant (par exemple, .com). Mais alors si vous liquidez l'ancien domaine, vous perdrez des milliers de liens placs sur d'autres vitrines. Vous perdrez galement votre position dans les moteurs de recherche qui indexent de nombreuses sous-pages avec l'an-cienne adresse et les mots cls lis. Au premier abord, la solution du problme de migration semble simple : il suffit de placer les deux domaines sur le mme compte. D'autres difficults y sont toutefois lies, par exemple, le moteur de recherche Goo-gle voit les domaines de ce type, comme double content, autrement dit, deux vitri-nes avec le mme contenu. Mod_Rewrite vous y sera utile de nouveau : placez le fi-chier .htaccess dans le rpertoire principal de votre ancien domaine ; le contenu de ce fichier est le suivant :

    RewriteEngine On

    RewriteCond %{HTTP_HOST

    anciendomaine.com

    RewriteRule ^(.*)$

    http://www.nouveaudomaine.com

    /$1 [R=301,L]

    Comme vous pouvez le constater, une nouvelle commande RewriteCond appa-rat dans le code. Elle dtermine l'tendu de l'excution d'autres rgles. Elle dfinit la condition disant que les rgles seront interprtes seulement quand on entre depuis l'adresse anciendomaine.com. La syntaxe de la commande RewriteCond est la suivante :

    RewriteCond %{condition} adresse

    La seule rgle que vous dfinissez rcrit toutes les anciennes adresses sous forme de http://www.nouveaudomaine.pl/[adresse]. Afin de reconnatre tous les caractres, vous disposez de l'expression rgulire (.*) le point symbolise n'im-porte quel caractre et * n'importe quel nombre de caractres.

    La redirection utilise l'aide de RewriteRule et RewriteCond est meilleure que la redirection Redirect301 / http://www.nouveaudomaine.com traditionnelle car cette seconde redirige l'utilisateur immdiatement sur le nouveau domaine, indpendamment du fait s'il avait saisi l'adresse du nouveau ou de l'ancien do-maine. De plus, si vous utilisez l'ins-truction Redirect301 susmentionne (que vous placez galement dans le

    fichier .htaccess), il est facile de mettre le serveur en boucle. Si vous placez l'ins-truction Redirect301 redirigeant depuis l'ancienne adresse du serveur o se trou-vent deux domaines (anciendomaine.com et nouveaudomaine.com), le serveur vous redirigera en boucle car il ne saura pas quel domaine est ancien et lequel est nouveau : les deux domaines liront le mme fichier .htaccess. Vous pouvez l'viter en utilisant l'ensemble prsent, compos d'une redirection conditionnelle RewriteCond et d'une rgle RewriteRule : le serveur pourra ainsi distinguer facile-ment les domaines car la redirection ne fonctionnera que si vous entrez depuis l'ancien domaine.

    Blocage efficacedes HotLinkTout le monde ou presque, qui place des fichiers tlcharger sur un site Web, connat la signification du mot HotLink : c'est l'ajout des fichiers choisis (par exemple, MP3 et PNG) depuis un autre service. En pratique, un webmestre achte un serveur o il place les fichiers, destins tlcharger de son site ; une personne d'un autre service ajoute tout simplement les mmes liens sur son site, ce qui entrane une augmentation du transfert sur le compte du webmestre qui a acquis le serveur. Les liens menant ce serveur sont surchargs ; de plus, certai-nes socits d'hbergement dfinissent des limites mensuelles du transfert du compte ; si la limite est dpasse, le site est suspendu.

    Afin de se protger contre ce ph-nomne, il faut installer un blocage de HotLinks. De nombreux blocages fonc-tionnant au niveau de PHP ont t con-us et implments jusqu' prsent. Les blocages les plus efficaces taient ceux qui vrifiaient le serveur recommandant (donc celui o on cliquait sur le lien) et comparaient son adresse l'adresse de la vitrine donc le propritaire a plac ses fichiers ; ils utilisaient galement la rcri-ture des liens afin de cacher les fichiers tlcharger en excutant en mme temps le script. Malheureusement, ces blocages avaient un dfaut : si l'on connaissait les vrais chemins de fichiers, le script ne se lanait pas et on pouvait tlcharger le fichier sans aucun problme.

    Mod_Rewrite vous vient ici aussi en aide. Il permet en effet d'amliorer la m-thode dcrite. Il suffit de crer le fichier

  • mod_rewriteFiche technique

    www.phpsolmag.org6 PHP Solutions N 6/2006

    .htaccess et de le placer ensuite dans le rpertoire protger :

    RewriteEngine On

    RewriteCond %{HTTP_REFERER} !^http://(.+\

    .)?page\.com [NC]

    RewriteRule ^.*\.(zip|exe|rar|gz|tar

    .gz|tar)$ http://www.page.com/

    HotLink.html [L]

    Grce la commande RewriteCond sus-mentionne et aux expressions rgulires, il est possible de dterminer facilement la condition d'excution des rgles pour les serveurs recommandants : les rgles (qui redirigent tous les HotLinks sur la page

    informant que la dmarche est interdit) sont excutes seulement si l'adresse du serveur recommandant vrifie par HTTP_REFERER n'est pas votre adresse. Pour viter le problme qui peut appa-ratre avec l'utilisation du prfixe www, utilisez l'expression rgulire (.+\.)?, permettant de ne pas se proccuper du prfixe. Remarquez que nous avons plac le point d'exclamation avant votre adresse (page.com) : il signifie la ngation dans le langage des expressions rgulires.

    La rgle place dans la ligne suivante vrifie, d'aprs l'extension du fichier, s'il est possible d'y diter des liens. Si cette extension (dcrite avec l'expression r-

    gulire .*\., donc n'importe_quel_caractre.caractres_derrire_le

    point ; attention l'chappement du ca-ractre de point) appartient au groupe des fichiers interdits (ici zip, exe, rar, gz, tar.gz et tar), le lien au fichier ne fonctionnera pas : l'utilisateur qui y clique sera redirig la page HotLink.html.

    La solution dcrite est trs utile mais elle a un dfaut : lorsque vous saisissez l'adresse du fichier dans le navigateur (vous la recevrez par exemple en cour-riel ou par la messagerie instantane), le blocage HotLink fonctionnera et vous ne pourrez pas tlcharger le fichier. Et l'ide du blocage ne consiste pourtant pas rendre difficile la vie de simples utilisateurs mais des propritaires des services qui surchargent vos bandes ! Afin de rsoudre ce problme, il est possible de modifier le code de manire suivante :

    RewriteEngine On

    RewriteCond %{HTTP_REFERER} !^http://(.+\

    .)?page\.com [NC]

    RewriteRule^ .*\.(zip|exe|rar|gz|tar.gz

    |tar)$

    http://www.page.com/index.php?page=down

    load&file=$1 [L]

    Il redirigera l'utilisateur l'adresse :

    index.php?page=download&file=nom_du_fichier

    o vous placez le script PHP qui sert t-lcharger les fichiers (nous ne le prcisons pas dans l'article car il peut s'agir de n'im-porte quel script disponible sur Internet ou bien votre propre script). L'utilisateur verra s'afficher un message contenant le lien au fichier et il devra le tlcharger depuis votre site : le blocage de HotLinks ne l'empchera pas cette fois-ci de le faire. L'adresse utilise ici n'est qu'un exemple et il faut l'adapter votre propre service. Vous pouvez employer le blocage de Hot-Links dcrit avec les fichiers graphiques, ce que font en gnral les entreprises proposant l'hbergement gratuit.

    Rcriture des adresses URL (liens conviviaux)Mod_Rewrite permet galement de rcri-re les liens. De nombreuses personnes se sont tonnes en voyant sur un site Web dynamique des adresses du type gal-lery-photo-1.html qui masquent en ralit les adresses URL relles (par exemple, index.php?module=gallery&function=pho

    Listing 4. Ensemble de rgles correct pour crer des adresses URL conviviales dans un exemple de galerie de photos

    RewriteEngine On

    RewriteRule ^([^-]+)/([^-]+)/([^-]+)/$ index.php?module=$1&function=$2&id=$3

    [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)/$ index.php?module=$1&function=$2 [L,NC,NS]

    RewriteRule ^([^-]+)/$ index.php?module=$1 [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?module=$1&function=$2&id=$3

    [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)$ index.php?module=$1&function=$2 [L,NC,NS]

    RewriteRule ^([^-]+)$ index.php?module=$1 [L,NC,NS,QSA]

    Tableau 1. Rcriture des adresses qui commencent par le mot gallery

    Adresse Adresse relle

    gallery/valeur2/valeur3 ou gallery/valeur2/valeur3/

    index.php?module=gallery&function=warto2&id=warto3

    gallery/valeur2 ou gallery/valeur2/ index.php?module=gallery&function=warto2

    gallery ou gallery/ index.php?module=gallery

    Tableau 2. Rcriture des adresses qui commencent par le mot news

    Adresse Adresse relle

    news/valeur2/valeur3 ou news/valeur2/valeur3/

    index.php?module=news&action=valeur2&id=valeur3

    news/valeur2 ou news/valeur2/ index.php?module=news&action=valeur2

    news ou news/ index.php?module=news

    Tableau 3. Rcriture des adresses qui commencent par le mot diffrent de gallery et news

    Adresse Adresse relle

    valeur1/valeur2/valeur3 ou valeur1/valeur2/valeur3/

    index.php?module=warto1&option=valeur2&id=valeur3

    valeur1/valeur2 ou valeur1/valeur2/ index.php?module=valeur1&option=valeur2

    valeur1 ou valeur1/ index.php?option=valeur1

  • Fiche techniquemod_rewrite

    www.phpsolmag.org 7PHP Solutions N 6/2006

    to&id=351). Vous n'tes pas sans savoir qu'aujourd'hui, si une page Internet veut remporter un succs, elle doit avoir une bonne position sur les moteurs de recher-che, comme Google. Le lien qui commen-ce par index.php avec de nombreuses variables n'est convivial ni l'utilisateur ni au moteur de recherche parce qu'il contient les caractres qui ne sont pas apprcis, comme le point d'interrogation et l'esperluette (&). Les pages avec de tel-les adresses URL ne sont gure indexes ou sont indexes lentement. De plus, les systmes CMS (en anglais Content Mana-

    gement Systems : systmes de gestion de contenu) utilisent souvent les identifiants de session dans les adresses URL (les moteurs de recherche et les navigateurs n'acceptent gure dans la plupart des cas l'envoi de cet ID via les cookies) ; l'adresse peut ainsi tre peu attrayante :

    index.php?module=gallery&function=photo&

    id=35&PHPSESSID=accfcc299077b36817dc5

    34c90588253

    Grce Mod_Rewrite, il vous est possi-ble de rendre l'adresse de votre site plus

    attrayante pour les moteurs de recherche (et les utilisateurs qui aiment noter ou re-tenir les adresses URL) et de supprimer l'identifiant de session des liens.

    Dans un premier temps, sachez qu'un code prt, fonctionnant sur toutes les pages, n'existe pas ; nous utiliserons donc un exemple pratique adapter chaque page. Supposons donc que vous voulez modifier les simples liens index.php?module=valeur1&function=valeur2&id=valeur3 en adresses rcrites, comme dans les catalogues (valeur1/valeur2/valeur3). titre d'exemple, si vous avez une galerie de photos et vous voulez que l'utilisateur soit redirig la page http://www.mondomaine.pl/index.php?module=gallery&function=photo&id=21, en saisissant l'adresse du type http://www.mondomaine.com/gallery/photo/21, sans le savoir (le navigateur affiche tou-jours une adresse URL conviviale). Nous ne voulons pas et nous ne crerons pas les rpertoires appels gallery, photo ou 21. Mod_Rewrite permet aussi de faire simuler des noms de fichiers et de rper-toires : crez le fichier .htaccess dont le contenu est le suivant :

    RewriteEngine On

    RewriteRule ^([^-]+)/([^-]+)/([^-]+)$

    index.php?module=$1&function=$2&id=$3

    [L,NC,NS]

    Dans la rgle ci-dessus, vous avez uti-lis trois drapeaux indiquant notamment que les adresses taient insensibles la casse (drapeau NC) et que la rcriture ne se terminait pas avec une seule rgle (drapeau L) parce que ce n'est que le d-but de votre fichier .htaccess. Ainsi, aussi bien l'adresse http://www.mondomaine.pl/gallery/photo/21 que par exemple, l'adres-se http://www.mondomaine.pl/galLeRy/phOtO/21 seront correctes. L'expression rgulire ([^-]+) permet en revanche d'ajouter n'importe quel mot.

    Tout fonctionne bien mais en tes-vous srs ? Que se passerait-il si vous saisissez seulement gallery/photo/ dans l'adresse, sans prciser le numro de la photo ? Vous verrez alors le message d'absence du rpertoire parce que la rgle prsente ne dcrit que les adresses URL trois niveaux. Le Listing 4 prsente le code qui permet de rsoudre ce problme.

    Dans ce cas-l, la hirarchie de r-gles est importante : l'ordre de rgles doit tre prpar de sorte que les rgles ne

    Listing 5. Nous gardons le schma de liens avec des paramtres diffrents

    RewriteEngine On

    RewriteRule ^gallery/([^-]+)/([^-]+)/$ index.php?module=gallery&function=$1&id=

    $2 [L,NC,NS]

    RewriteRule ^gallery/([^-]+)/$ index.php?module=gallery&function=$1 [L,NC,NS]

    RewriteRule ^gallery/$ index.php?module=gallery [L,NC,NS]

    RewriteRule ^gallery/([^-]+)/([^-]+)$ index.php?module=gallery&function=$1&id=$2

    [L,NC,NS]

    RewriteRule ^gallery/([^-]+)$ index.php?module=gallery&function=$1 [L,NC,NS]

    RewriteRule ^gallery$ index.php?module=gallery [L,NC,NS]

    RewriteRule ^news/([^-]+)/([^-]+)/$ index.php?module=news&action=$1&id=$2

    [L,NC,NS]

    RewriteRule ^news/([^-]+)/$ index.php?module=news&action=$1 [L,NC,NS]

    RewriteRule ^news/$ index.php?module=news [L,NC,NS]

    RewriteRule ^news/([^-]+)/([^-]+)$ index.php?module=news&action=$1&id=$2

    [L,NC,NS]

    RewriteRule ^news/([^-]+)$ index.php?module=news&action=$1 [L,NC,NS]

    RewriteRule ^news$ index.php?modul=news [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)/([^-]+)/$ index.php?module=$1&option=$2&id=$3

    [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)/$ index.php?module=$1&option=$2 [L,NC,NS]

    RewriteRule ^([^-]+)/$ index.php?module=$1 [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)/([^-]+)$ index.php?module=$1&option=$2&id=$3

    [L,NC,NS]

    RewriteRule ^([^-]+)/([^-]+)$ index.php?module=$1&option=$2 [L,NC,NS]

    RewriteRule ^([^-]+)$ index.php?module=$1 [L,NC,NS,QSA]

    Listing 6. Ensemble de rgles permettant d'utiliser les adresses simulant les fichiers html (par exemple, gallery-photo-21.html)

    RewriteEngine On

    RewriteRule ^gallery-([^-]+)-([^-]+)\.html$ index.php?module=gallery&function=$1

    &id=$2 [L,NC,NS]

    RewriteRule ^gallery-([^-]+)\.html$ index.php?module=gallery&function=$1

    [L,NC,NS]

    RewriteRule ^gallery\.html$ index.php?module=gallery [L,NC,NS]

    RewriteRule ^news-([^-]+)-([^-]+)\.html$ index.php?module=news&action=$1&id=$2

    [L,NC,NS]

    RewriteRule ^news-([^-]+)\.html$ index.php?module=news&action=$1 [L,NC,NS]

    RewriteRule ^news\.html$ index.php?module=news [L,NC,NS]

    RewriteRule ^([^-]+)-([^-]+)-([^-]+)\.html$ index.php?modul=$1&opcja=$2&id=$3

    [L,NC,NS]

    RewriteRule ^([^-]+)-([^-]+)\.html$ index.php?module=$1&option=$2 [L,NC,NS]

    RewriteRule ^([^-]+)\.html$ index.php?module=$1 [L,NC,NS]

  • mod_rewriteFiche technique

    www.phpsolmag.org8 PHP Solutions N 6/2006

    se drangent pas mutuellement. titre d'exemple, si la premire d'entre elles tait un seul niveau et vous saisissez gallery/photo/21, l'adresse indiquerait index.php?module=gallery/photo/21 ; il faut donc dans un premier temps dfinir les rgles dont le nombre des niveaux est le plus lev. Faites aussi attention au drapeau QSA dans la dernire rgle. Cette rgle ne fonctionnerait pas sans ce drapeau parce que l'expression rgu-lire ([^-]+) ne peut pas exister seule si RewriteBase n'a pas t dfini.

    Il est donc possible d'utiliser votre ensemble de rgles d'une autre manire, par exemple, si l'utilisateur ne prcise par l'identifiant de la photo, il est redirig la liste de toutes les images de la galerie (si la galerie contient plusieurs niveaux, l'utilisateur peut alors tre redirig une liste thmatique de photos) ou redirig l'adresse /gallery. Cette dmarche permet de rendre plus souple la fonctionnalit de votre service.

    Remarquez galement qu'avec trois niveaux, vous avez dfinit 6 rgles alors qu'une rgle suffirait en principe pour chacun d'entre eux. Observez attentive-ment les trois premires rgles et vrifiez quelles sont les diffrences avec les trois autres (sans prendre en compte QSA dans la dernire ligne). Dans les trois premires rgles, le signe de slash (/) se trouve la fin de la dernire expression, ce qui n'est pas le cas des trois autres r-

    gles ; grce cette dmarche, les adres-ses qui se terminent ainsi (par exemple, http://www.mondomaine.pl/gallery/photo/21/) et celles qui ne se terminent pas ainsi (par exemple, http://www.mondomaine.pl/gallery/photo/21) seront correctes.

    Rien n'empche de garder le mme schma de liens (par exemple, valeur1/valeur2/valeur3) avec les paramtres diffrents (par exemple, gallery/valeur1/valeur2 versus news/valeur2/valeur3).

    Regardez le Listing 5. La valeur du fichier .htaccess y prsente permet de garder le schma susmentionn valeur1/valeur2/valeur3 indpendamment des variables transmises. Comme vous pou-vez le remarquer, l'ensemble de rgles prvues pour la galerie se trouve en haut de la hirarchie. L'ensemble est organis de sorte qu'il fonctionne seulement quand le premier pseudo-rpertoire (ici, valeur1) indique le mot gallery. Dans ce cas-l, Mod_Rewrite rcrit les adresses d'aprs le schma du Tableau 1. Le deuxime ensemble fonctionne seulement quand le premier pseudo-rpertoire indique le mot news. Dans ce cas-l, les adresses res-semblent celles du Tableau 2.

    Comme vous pouvez le constater, c'est la variable action qui est transmise au lieu de la variable function ; il est bien videmment possible de transmettre autre chose, mise part les variables module et id : tout dpend de la structure de la page.

    De plus, si le premier mot de l'adresse n'est ni gallery ni news, les adresses sont rcrites comme le prsente le Tableau 3.

    Dans ce cas-l, la variable option se distingue dans l'adresse. Mentionnons ici de nouveau la hirarchie de rgles. Si vous placiez le dernier ensemble de ce fichier avant les ensembles news et gal-lery, toutes les adresses y seraient sou-mises ; autrement dit, la variable option serait toujours transmise en deuxime paramtre parce que, par exemple, les adresses gallery/photo/341 et news/read/53 correspondent ce schma et elles seraient y compares au tout dbut. Lorsque, toutefois, ce schma se trouve la fin du fichier, les adresses sont compa-res dans un premier temps aux premiers ensembles et ensuite, au cas d'chec, au dernier ensemble.

    Les adresses rcrites ne doivent pas forcment ressembler aux rpertoires. Il est possible d'utiliser Mod_Rewrite de sorte que les adresses soient masques sous forme des fichiers HTML, ce qui est davantage impressionnant. Le schma valeur1/valeur2/valeur3 se prsenterait en gnral ainsi : valeur1-valeur2-valeur3.html, par exemple, gallery-photo-21.html. Afin d'obtenir cet effet, il faut restructurer l'ensemble de rgles prc-dant dans le fichier .htaccess, ce qui n'est pas difficile (Listing 6).

    Comme vous le voyez, le nombre de rgles a diminu parce que les principes supplmentaires taient prsents dans l'exemple prcdent ; ces principes per-mettaient par exemple de terminer l'adres-se par un slash (/), quoique ce ne soit pas obligatoire. Cette fois-ci, les slashs ne sont pas employs : ils sont remplacs par les tirets ; la fin, se trouve le suffixe .html, remplaant en quelque sorte l'extension du fichier. Comme nous l'avons men-tionn, il est ncessaire de placer la barre oblique inverse (\) avant les caractres spciaux ; c'est pour cette raison qu'elle se trouve devant le point. Grce au fichier .htaccess du Listing 6, les adresses URL se prsentent comme dans les Tableaux 4, 5 et 6. En consquence, tout fonctionne de la mme manire qu'avec les adresses du style rpertoire.

    Supprimer l'identifiant de la sessionComme nous l'avons mentionn, mme les adresses URL le mieux structures ne seront pas efficaces (pour le position-

    Tableau 4. Rgles rcriture des adresses de galerie simulant des fichiers HTM

    Adresse Adresse relle

    gallery-valeur2-valeur3.html index.php?module=gallery&function=valeur2&id=valeur3

    gallery-valeur2.html index.php?module=gallery&function=valeur2

    gallery.html index.php?module=gallery

    Tableau 5. Rgles de rcriture des adresses de news simulant des fichiers HTML

    Adresse Adresse relle

    news-valeur2-valeur3.html index.php?module=news&action=valeur2&id=valeur3

    news-valeur2.html index.php?module=news&action=valeur2

    news.html index.php?module=news

    Tableau 6. Rgles de rcriture d'autres adresses (ni news ni galerie) simulant des fichiers HTML

    Adresse Adresse relle

    valeur1-valeur2-valeur3.html index.php?module=valeur1&option=valeur2&id=valeur3

    valeur1-valeur2.html index.php?module=valeur1&option=valeur2

    valeur1.html index.php?option=valeur1

  • Fiche techniquemod_rewrite

    www.phpsolmag.org 9PHP Solutions N 6/2006

    nement des pages dans les moteurs de recherche), si vous ajoutez l'identifiant de session aux liens. En consquence, au lieu de ressembler gallery/photo/21 et gallery-photo-21.html, vos adresses se prsenteront ainsi :

    gallery/photo/21?PHPSESSID=accfcc299077b3

    6817dc534c90588253

    ou bien :

    gallery-photo-21.html?PHPSESSID=accfcc29

    9077b36817dc534c90

    588253

    Le moteur de recherche y trouve un point d'interrogation, un signe d'galit et une suite inutile (pour le moteur de recherche) de caractres qui rallonge l'adresse URL. Ce problme survient bien videmment seulement quand le service donn uti-lise la fonction de sessions en PHP. Pour que les moteurs de recherche n'ajoutent pas le numro de la session aux liens, il faut ajouter les lignes suivantes au fichier .htaccess, sous RewriteEngine On :

    Options FollowSymLinks

    php_flag session.use_trans_sid off

    Si vous verrez une erreur 500 (Internal Server Error) la place de la page, cela signifie que l'option use_trans_sid est paramtre globalement sur on dans la configuration du serveur et il est impossi-ble de la modifier localement. Il ne vous reste alors qu' demander l'administra-teur de paramtrer cette option localement en off.

    Utilisation pratiquede Mod_Rewrite dans les systmes CMSEn pratique, Mod_Rewrite a de nombreu-ses applications dans les systmes du type CMS. Nous citerons et analyserons les systmes les plus populaires.

    Titres des sous-pages ou des articles dans les adresses URLBien que les liens conviviaux ne soient pas la cl un grand succs dans les moteurs de recherche, ils influencent beaucoup la position de la page. Afin de renforcer en plus la position, par exemple, sur Google, il est recommand de prpa-rer les adresses contenant les noms des sous-pages, les titres d'actualits, etc. Si un internaute saisit alors la phrase Tintin part en aventure sur Google et vous avez

    une sous-page indexe avec l'adresse tintin_part_en_aventure.html ou news/ tintin_part_en_aventure (parce que, par exemple, vous avez une vitrine consacre aux bandes dessines), vous pouvez tes srs que Google traitera votre page mieux que les autres. Pour obtenir une telle adresse, il suffit d'ajouter une simple rgle au fichier .htaccess :

    RewriteRule ^news/(.*)$ index.php?module

    =news&name=$1

    ou bien, dans le cas des liens avec le suf-fixe .html :

    RewriteRule ^news-(.*)\.html$ index.php?m

    odule=news&name=$1

    L'expression rgulire (.*) permet d'enregistrer n'importe quelle suite de caractres (y compris, des espaces) ; en thorie, il est donc possible de noter l'adresse sous forme de news/Tintin part en aventure, bien que cette solution ne soit pas conseille parce que les na-vigateurs et les moteurs de recherche interprtent les espaces de manires diffrentes. L'exemple susmentionn peut dj fonctionner condition que le systme CMS sur votre vitrine soit ca-pable de trouver l'article d'aprs le nom contenu dans la variable, sans ID. Les systmes CMS, pourvues des fonctions du type GetIdFromName(nom), ne sont pas nombreux et nous ne voulons pas les analyser en dtails en ce moment.

    Il y a un autre problme concernant l'exemple ci-dessus, savoir les caract-

    res spciaux et les caractres nationaux, les accents (par exemple, franais ou italien), les Umlaut allemands, etc. Il est conseill de changer les caractres sp-ciaux en tirets, les caractres nationaux en version latine. Remplacez les espaces par les tirets bas (_) et changez toutes les lettres en minuscules.

    Grce la fonction replace_titles(), crite en PHP et prsente sur le Listing 7, il est possible de modifier la phrase Un petit hrisson mange une pomme pourrie en un_petit_hrisson_mange_une,_pom-me_pourrie.

    Nous avons expliqu le fonctionne-ment de cette fonction dans les commen-taires. Il est bien videmment possible d'agrandir ou d'adapter d'autres lan-gues le tableau avec les caractres. Il est trs facile d'utiliser cette fonction dans le systme CMS. Supposez que le fichier news.php est charg d'afficher les actua-lits. Premirement, il faut placer cette fonction au dbut de ce script. Deuxi-mement, il suffit de trouver le modle du lien (supposons que CMS n'utilise pas le systme de modles mais les simples variables PHP pour dterminer le modle des liens) qui se prsente plus ou moins ainsi :

    Il faut le modifier en modle, permettant de crer des adresses URL conviviales l'aide de votre fonction. Utilisez-la de ma-nire suivante pour les adresses simulant les rpertoires :

    Listing 7. Fonction replace_titles(), charge de modifier la taille des lettres et de supprimer les caractres nationaux

  • mod_rewriteFiche technique

    www.phpsolmag.org10 PHP Solutions N 6/2006

    > [pas propre comme code !

    , un echo gnral serait

    plus claire]

    En revanche, pour les adresses ne simu-lant pas les fichiers, le modle se prsen-tera ainsi :

    -id/>

    Votre schma avec les adresses de rper-toires se prsente ainsi : news/ID/ nom_du_news et avec les adresses de fichiers, ainsi :news-nom_du_news-idID.html. prsent, afin de terminer cet ouvrage, ajoutez la rgle suivante (pour le schma de rpertoi-res) au fichier .htaccess :

    RewriteRule ^news/([^-]+)/(.*)$

    index.php?modul=news&id=$1 [L,NC,NS]

    Elle transmet seulement l'ID la variable id comme un mot. Le deuxime param-tre peut constituer n'importe quelle suite de caractres et il n'est pas ncessaire de le transmettre parce que seul ID suffira pour reconnatre l'actualit.

    Voici la mme rgle pour le schma de fichiers :

    RewriteRule ^news-(.*)-([^-]+)\.

    html$ index.php?modul=news&

    id=$2 [L,NC,NS]

    Cette rgle ne transmet que l'ID la variable id mais cette fois-ci, il se trouve dans le deuxime paramtre et il est donc transmis comme $2. Rappelons qu'il n'est pas ncessaire d'utiliser le paramtre $1.

    Nous ne prciserons pas de nouveau les tables avec les exemples de rcriture des adresses parce qu'il est facile de le faire soi-mme. Nous avons utilis bien videmment les exemples de test si vous voulez les implmenter dans les sys-tmes CMS fonctionnant, il faut avoir des connaissances en PHP.

    Utilisation des liens conviviaux dans les systmes CMS populairesNous vous prsenterons maintenant comment implmenter les adresses URL conviviales dans les CMS populaires, bass sur la plate-forme Nuke (Post-Nuke, MDPro, PHP-Nuke, enVolution,

    etc.). Elles sont compatibles avec le module de gnration de layout, ap-pel AutoTheme (MDPro et PHP-Nuke en sont mme dots dans l'installation standard). Actuellement, c'est le systme de modles des CMS le plus souvent uti-lis. Ce module permet d'activer les liens conviviaux dans les paramtres. Mal-heureusement, il ne s'agit que des liens du style fichier ; heureusement, il est possible de slectionner le suffixe (vous avez au choix par dfaut .html, .htm et .phtml). Aprs avoir lanc la modification des liens en liens conviviaux, il suffit de copier l'un des fichiers .htaccess dans le rpertoire principal ; ces fichiers sont fournis avec le module. Les noms de ces fichiers commencent par un suffixe, si vous optez donc pour .phtml, copiez le fichier phtml.htaccess dans le rpertoire principal de la page et modifiez son nom en .htaccess. Aprs cette opration, les schmas par dfaut des liens conviviaux fonctionneront. Notre objectif consiste toutefois dcrire comment transformer ces schmas et les paramtrer de sorte que les liens aux actualits contiennent les noms de ces actualits.

    Les systmes de portail susmen-tionns contiennent le fichier funcs.php dans le rpertoire modules/News/. Il est charg de gnrer les liens dans le sys-tme d'actualits. Ouvrez-le et placez-y la fonction de remplacement de titres dcrite ci-dessus (replace_titles()) du Listing 7, aprs le commentaire de l'auteur. Ensuite, trouvez le commentaire dans le fichier funcs.php :

    // Allowed to read full article?

    et placez derrire :

    $nazwa_newsa =

    replace_titles($info[title]);

    La variable $nom du news appellera la fonction replace_titles() et l'utilisera pour le titre de l'actualit prcise dans la variable $info[title]. La ligne suivante se trouve en dessous du code que vous aviez plac :

    if (pnSecAuthAction(0, $component,

    $instance, ACCESS_READ)) {

    Il faut ajouter la dfinition de la variable $fullarticle en dessous de ce code. Changez la ligne avec cette dfinition en :

    $fullarticle = $news_name.'-id'.

    $info[sid].'.html';

    Grce cette dmarche, le lien l'ac-tualit se prsente ainsi : nom_du_news-id31.html o le chiffre 31 est un exemple d'ID de l'actualit. Il faut bien videmment modifier le suffixe .html en suffixe slec-tionn. Il ne vous reste qu' ajouter la r-gle votre fichier .htaccess ; elle devrait se trouver la premire :

    RewriteRule ^(.*)-id([0-9]+)\.html$

    modules.php?op=modload&file=

    article&sid=$2 [L,NC,NS]

    Tout va donc fonctionner. Remarquez que pour l'ID, vous avez utilis une expression rgulire, permettant d'ajouter seulement un chiffre donn.

    De plus, il est possible de modifier le schma de gnration de liens par dfaut en AutoTheme. Il s'agit par dfaut des quivalents anglais des modules qui fonctionnent avec ces CMS. Afin de les modifier, ouvrez le fichier modules/AutoTheme/extras/nom_du_systme_cms-utilis/autourls.ext.php.

    Vous verrez dans ce fichier deux tableaux : $search et $replace ainsi que la fonction preg_replace(), charge de modifier toutes les adresses d'aprs les expressions de tableaux. Pour modifier le schma des liens, il faut donc modi-fier les tableaux ; ils se correspondent d'aprs le principe suivant : la premire position du tableau $search est chan-ge en premire position du tableau $replace, la deuxime position en deuxime, etc. ; pour cette raison, les deux tableaux ont le mme nombre de positions. Nous vous expliquerons l'di-tion sur l'exemple d'une des positions du tableau $search :

    $prefix . 'index.php\?newlang=([\wd\.:

    \_/]+)|',

    Comme vous pouvez le constater, l'endroit o il est possible de placer la valeur dans l'adresse URL contient une expression ([\w\d\.\:\_\/]+) ; aprs le traitement par la fonction preg_replace(), le rsultat de cette expression est marqu par le nom $1. Il faut le placer dans le tableau $replace. L'entre dans ce tableau $replace se prsentera donc ainsi :

    'changelang-$1.'.$autourlsext.'',

  • Fiche techniquemod_rewrite

    www.phpsolmag.org 11PHP Solutions N 6/2006

    La variable $autourlsext signifie le suf-fixe.

    Nous n'allons pas cependant dcrire en dtails les modifications des CMS et leurs modules, nous nous arrtons donc ici. Nous nous limiterons montrer quoi doivent ressembler les nouvelles positions. titre d'exemple, si vous voulez ajouter une position index.php?module=valeur1&file=valeur2, il faut placer le signe de slash avant le point d'interrogation et remplacer le caractre & par l'expression &(?:amp;)?, qui est une condition du type ou : elle fonction-nera si le lien contient le caractre & et & (version correcte). Il faut remplacer Valeur1 et valeur2 par l'expression ([\w\d\.\:\_\/]+) et placer les caractres "| la fin de la position. L'ensemble doit se prsenter ainsi :

    $prefix.'index.php\?module=

    ([\wd\.:\_/]+)&(?:amp;)?

    file=([\wd\.:\_/]+)|'

    Pour que tout fonctionne correcte-ment, il faut modifier les rgles dans le fichier .htaccess de sorte qu'elles correspondent aux positions du fi-chier autourls.ext.php. Nous esprons qu'il n'y aura pas de problme avec cette dmarche. Vous pouvez voir le rsultat de l'utilisation des liens con-viviaux dans le systme CMS sur le site officiel de CMS : PostNuke, http://www.postnuke.com/.

    ConclusionNous vous avons prsent comment em-ployer en pratique les rgles Mod_Rewri-te et les dcrire l'aide des expressions rgulires. Les exemples utiliss de-vraient vous servir des conseils suivre.

    Tous ces exemples ont t tests sur plusieurs serveurs et fonctionnent cor-rectement. Si jamais l'un d'entre eux ne retourne pas le rsultat attendu, la faute est au serveur. Tout dpend en effet de la configuration de Mod_Rewrite sur le serveur et elle peut tre errone.

    N'oubliez pas que le module Mod_Rewrite est puissant et il est impossible de dcrire toutes ses fonctionnalits dans un seul article, voire dans un seul numro du magazine. Nous vous souhaitons donc d'avoir des rgles correctes, des utilisa-teurs satisfaits et des positions leves dans les moteurs de recherche grce Mod_Rewrite. n

    SUR INTERNET

    http://httpd.apache.org Site officiel de Apache

    http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html Documen-tation officielle de Mod_Rewrite

    http://phpnuke.org Site officiel du projet PHP-Nuke

    http://www.postnuke.com/ Site officiel de CMS PostNuke

    http://perldoc.perl.org/perlre.html Sites officiels de Perl sur les ex-pressions rgulires

    http://www.regular-expressions.info/ Vitrine sur les expressions rguli-res