Les adresses URL en PHP : comment mettre
Transcription
Les adresses URL en PHP : comment mettre
Fiche technique Les adresses URL en PHP : comment mettre mod_rewrite au travail ? Niveau de difficulté : lll Michał Gacki 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 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. M Auteur Michał Gacki est programmeur autodidacte. Depuis de nombreuses années, il s'intéresse à l'informatique et en particulier, à 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. 2 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émentaires 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. www.phpsolmag.org 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érifier vous-mêmes. Pour ce faire, Ce qu'il faut savoir... Des connaissances moyennement avancées sur la configuration 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 fichiers à l'aide de Mod_ Rewrite. Nous expliquerons également les notions des expressions régulières. PHP Solutions N° 6/2006 mod_rewrite Fiche technique modules/mod_rewrite.so, ClearModuleList Figure 1. Modules du serveur Apache dans l'environnement PHP réalisez un simple test : créez un fichier test.php où vous placerez le code suivant et l'effectuerez dans le serveur : <?php phpinfo(INFO_MODULES); ?> Dans ce script, appelez la fonction php_info() qui précise les paramètres concernant l'environnement PHP. Si vous utilisez le paramètre INFO_MODULES, seules les informations sur les modules installés doivent s'afficher (Figure 1). Si la liste contient le nom mod_rewrite, sélectionné sur la Figure 1, vous pouvez être sûrs que Mod_Rewrite est installé sur votre serveur. Il peut toutefois arriver que la fonction ne retourne pas d'informations sur les modules (cela dépend de la configuration du serveur) ; afin de vérifier si Mod_Rewrite est présent, utilisez donc le script présenté sur le Listing 1 ; placez-le également sur le serveur sous le nom de test.php. Ensuite, créez un fichier .htaccess dont le contenu se trouve sur le Listing 2. Le fonctionnement de ce tandem est simple : définissez un exemple de règle Mod_Rewrite dans le fichier .htaccess ; cette règle réécrit tous les liens au fichier test.php comme test.php?tester=1 ; ainsi, la variable tester ($tester) avec la valeur 1 affectée 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 vérifiez si la variable $tester est présente à l'aide de isset($tester), vous supposez que les register_ globals sont [activées] dans les paramètres du parseur PHP. Et en fait, elles sont désactivées sur les nombreux serveurs pour des raisons de sécurité. Il est donc recommandé d'utiliser la construction isset($_GET['tester']) > PHP4.1 ou PHP Solutions N° 6/2006 bien isset($HTTP_GET_VARS['tester']) < PHP4.1. Une autre remarque concerne la création du fichier .htaccess sous Windows. Il est impossible de créer le fichier dont le nom commence par un point sous ce système. Pour ce faire, créez un fichier. Il suffit d'ouvrir le bloc note (démarrer Exécuter : 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 commandes Mod_Rewrite et que le module ne fonctionne pas, si vous saisissez alors n'importe quelle adresse réécrite du fichier du même répertoires que .htaccess, vous verrez un message d'erreur 404 (impossible de trouver le fichier) [mal dit, phrase trop long]. D'autres fonctions du répertoire ne fonctionneront pas ou vous verrez s'afficher l'erreur 500 (Internal Server Error). Vous verrez cette deuxième erreur surtout quand le serveur interprétera RewriteRule (et n'importe quelle autre commande mod_rewrite) comme une erreur de syntaxe .htaccess. Si vous n'utilisez pas un serveur d'hébergement mais votre propre serveur et que la réécriture des liens ne fonctionne pas, alors il faut modifier le fichier de configuration 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 et AddModule mod_rewrite.c et supprimez les caractères de commentaires (#) par lesquels elles commencent. Il faut également trouver dans ce fichier la directive AccessFileName qui détermine le nom du fichier par défaut, capable de stocker les paramètres dans les répertoires. .htaccess est le nom par défaut mais si ce n'est pas le cas, saisissez .htaccess. À présent, il suffit de redémarrer Apache et d'effectuer de nouveau les tests : la réécriture devrait fonctionner. Mod_Rewrite : au travail Si vous disposez du module Mod_Rewrite, vous pouvez passer aux exemples plus avancés de son utilisation. Vous avez vérifié auparavant si la variable transmise au script, à l'aide de Mod_Rewrite, existe . Maintenant, vérifiez également sa valeur (true ou false). Pour ce faire, créez le fichier index.php dont le code est présenté sur le Listing 3. N'oubliez pas les register_globals ! Vous auriez aussi besoin 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 : après que vous ayez saisi le nom index.php dans le navigateur Internet [confusion inutile], Mod_Rewrite réécrit index.php comme index.php?menu=true ; grâce à cette démarche, la variable $menu sera envoyée au parseur PHP. Si cette opération réussit, vous verrez un message vous informant que la variable $menu existe. La valeur de la variable $menu2 sera aussi changée en true (remarquez qu'au début du script sa valeur est false, pour qu'il soit impossible Listing 1. Nous vérifions si Mod_Rewrite a été installé sur le serveur <?php if (isset($sprawdzacz)) { ?> Mod_Rewrite est installé sur ce serveur <? } else { ?> Mod_Rewrite n'est pas installé sur le serveur ou bien il est configuré incorrectement <? } ?> www.phpsolmag.org 3 Fiche technique mod_rewrite de la modifier via la méthode GET) et vous verrez s'afficher le reste du message. Cette partie est simple, passons donc à l'analyse du fichier .htaccess. Premièrement, afin de créer des règles de Mod_Rewrite, il faut placer l'instruction RewriteEngine On qui, comme son nom l'indique, active la réécriture. Ensuite, définissez chaque règle via la commande RewriteRule. La syntaxe de cette commande se présente ainsi : RewriteRule ^adresse source$ adresse réécrite. [DRAPEAUX] La première adresse, adresse source, dont le nom commence toujours par le caractère ^ et se termine par le caractère de Listing 2. Fichier .htaccess que nous utilisons avec test.php pour vérifier si Mod_Rewrite est présente Options +FollowSymLinks <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(test.php)$ test.php?tester=1 [QSA] RewriteRule ^$ test.php?tester=1 [QSA] </IfModule> Listing 3. Nous vérifions la valeur de la variable j$menu <? $menu2 = false; if (isset($menu) && $menu == true) { ?> <br /><b>La variable $menu existe, quoiqu'elle ne soit pas précisée dans l'adresse URL</b> <? $menu2 = true; } ?> <br /> <? if ($menu2 == true) { ?> Grâce à la variable précédente, la valeur de la variable $menu2 a été changée en true, c'est pour cette raison que ce texte est visible. <? } ?> dollar ($) constitue une masque d'après laquelle Mod_Rewrite réécrira l'adresse saisie dans le navigateur comme adresse réécrite. N'oubliez pas que si vous utilisez des caractères spéciaux dans n'importe quelle adresse : un signe de dollar ($), un point (.), un caret (^), une astérisque (*), un plus (+), un point d'interrogation (?), une barre oblique inversée (\) ou bien des accolades, des chevrons ({})ou des crochets ([]), il faut les précéder d'un caractère de barre oblique inversée (\). C'est dû au fait que les deux chemins sont reconnus à l'aide des expressions régulières (en anglais regular expressions) où ces caractères jouent des rôles définis . Le fait de précéder ces caractères par une barre oblique inversée s'appelle un échappement de caractères (en anglais character escaping). Ceci fait en sorte que chaque caractère spécial qui se trouve directement derrière cette barre est reconnu comme un caractère ordinaire. Une autre question concerne les drapeaux placés derrière les règles. Nous ne les avons pas employés dans les exemples susmentionnés parce qu'ils sont utiles seulement quand vous employez un grand nombre de règles. Les drapeaux les plus souvent utilisés sont les suivants : • Expressions régulières Dans les règles RewriteRule, nous utilisions les expressions régulières (en anglais regular expressions). Pour simplifier, il s'agit des modèles de chaînes de symboles, utilisés pour une recherche avancée des caractères dans un texte (en ce qui concerne RewriteRule, on recherche dans les noms de fichiers et de répertoires). Ces expressions trouvent le texte correspondant au modèle. Grâce à leur souplesse, les expressions régulières constituent un standard parmi les méthodes de recherche de texte. Sachez qu'il existe des syntaxes Unix et Perl (connue comme PCRE : Perl Compatible Regular Expressions et utilisée non seulement en Perl mais aussi en PHP, Ruby et d'autres langages, utilisant la bibliothèque PCRE, créée en C). Sans connaître au moins les notions des expressions régulières, il est difficile d'utiliser Mod_Rewrite. Voici quelques points utilisés dans les expressions régulières qui vous faciliterons le travail avec ce module : • • • • • • • • point (.) – n'importe quel caractère, texte1|texte2 – alternative : texte1 ou texte2, caret (^) – commence une zone donnée de caractères, dollar ($) – termine une zone donnée de caractères, point d'interrogation (?) – zéro ou un caractère précédant l'expression, astérisque (*) – zéro ou plusieurs caractères précédant l'expression, plus (+) – un ou plusieurs caractères précédant l'expression, (texte _ entre _ parenthèses) – regroupe le texte texte _ entre _ parenthèses. Afin de placer dans l'adresse cible les noms trouvés, correspondants à l'expression de la règle par rapport à l'adresse source, utilisez le signe de dollar ($), indiquant le résultat de la recherche ; placez le numéro de l'expression directement derrière le signe de dollar (le numéro se calcule à partir la première expression permettant de saisir le texte), par exemple, $1, $2 et $3. Les numéros des résultats de recherche sont affectés à chaque expression (contenue entre les parenthèses), par exemple, $1, $2 et $3 seront affectés à l'expression ^([^-]+)/([^-]+)/([^-]+)$. 4 www.phpsolmag.org • • • – grâce à ce drapeau, la règle fonctionnera indépendamment de la taille des lettres (majuscules ou minuscules) utilisées pour écrire l'adresse URL. Si vous ajoutiez le drapeau NC à l'exemple décrit, la façon d'écrire l'adresse ne serait pas importante, par exemple, INDEX.PHP, inDeX.pHp, IndeX.php, etc., OR – signifie la même chose que or en anglais : ou. Si vous ajoutez ce drapeau à la règle, vous pouvez être certains que si cette dernière n'est pas exécutée, le serveur tentera d'utiliser la règle qui se trouve une ligne en dessous, L – abréviation du mot anglais last (dernier). Si vous ajoutez ce drapeau, la vérification de toutes les règles dans .htaccess est arrêtée, si la règle le contenant est correcte et utilisée. R – abréviation de redirect (de l'anglais redirection). Si vous ajoutez ce drapeau, l'adresse sera redirigée à l'adresse réécrite. Si vous ajoutiez ce drapeau à notre deuxième exemple, la suite ?menu=true serait ajoutée à la barre d'adresses du navigateur, ce qui NC PHP Solutions N° 6/2006 mod_rewrite n'est pas une bonne solution. Lorsque vous employez le drapeau R , vous pouvez indiquer le type de la redirection, par exemple, vous noterez la redirection 301 (Redirect 301) comme R=301. Il est possible d'ajouter plusieurs drapeaux simultanément ; il suffit de les énumérer derrière la virgule entre les crochets à la fin de la règle, par exemple : [L,NC,OR]. Dans l'exemple de cet article, le chemin index.php sera réécrit comme index.php?menu=true. La solution de transmettre les variables est utile quand vous voulez transférer 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 données), il n'est pas nécessaire de modifier à chaque fois les fichiers ; il suffit de placer une seule fois la condition appropriée 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 connaît la variable dont dépend la condition, il peut l'ajouter à l'adresse URL et entrer ainsi dans la partie cachée du site Web ! RewriteBase La commande RewriteBase permet d'indiquer le répertoire où se trouvent les fichiers définies dans les adresses cibles. Sa syntaxe se présente ainsi : RewriteBase chemin À titre d'exemple, si vous créez le fichier .htaccess contenant le code : RewriteEngine On RewriteBase /répertoire/ RewriteRule ^index\.html$ index.php [L] et ensuite, vous saisissez index.html dans le navigateur, le contenu du fichier répertoire/index.php s'affichera. Grâce à l'utilisation de RewriteBase, vous n'êtes plus obligés de définir le répertoire dans la règle. Migration de domaines à l'aide de Mod_Rewrite Il arrive souvent que vous modifiez le domaine de votre service et vous souhaitez PHP Solutions N° 6/2006 garder l'ancien. À titre d'exemple, vous pouvez le transférer 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 placés sur d'autres vitrines. Vous perdrez également votre position dans les moteurs de recherche qui indexent de nombreuses sous-pages avec l'ancienne adresse et les mots clés liés. Au premier abord, la solution du problème de migration semble simple : il suffit de placer les deux domaines sur le même compte. D'autres difficultés y sont toutefois liées, par exemple, le moteur de recherche Google voit les domaines de ce type, comme double content, autrement dit, deux vitrines avec le même contenu. Mod_Rewrite vous y sera utile de nouveau : placez le fichier .htaccess dans le répertoire 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 apparaît dans le code. Elle détermine l'étendu de l'exécution d'autres règles. Elle définit la condition disant que les règles seront interprétées seulement quand on entre depuis l'adresse anciendomaine.com. La syntaxe de la commande RewriteCond est la suivante : RewriteCond %{condition} adresse La seule règle que vous définissez réécrit toutes les anciennes adresses sous forme de http://www.nouveaudomaine.pl/ [adresse]. Afin de reconnaître tous les caractères, vous disposez de l'expression régulière (.*) – le point symbolise n'importe quel caractère et * – n'importe quel nombre de caractères. La redirection utilisée à l'aide de RewriteRule et RewriteCond est meilleure que la redirection Redirect301 / http:// www.nouveaudomaine.com traditionnelle car cette seconde redirige l'utilisateur immédiatement sur le nouveau domaine, indépendamment du fait s'il avait saisi l'adresse du nouveau ou de l'ancien domaine. De plus, si vous utilisez l'instruction Redirect301 susmentionnée (que vous placez également dans le www.phpsolmag.org Fiche technique fichier .htaccess), il est facile de mettre le serveur en boucle. Si vous placez l'instruction Redirect301 redirigeant depuis l'ancienne adresse du serveur où se trouvent 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 même fichier .htaccess. Vous pouvez l'éviter en utilisant l'ensemble présenté, composé d'une redirection conditionnelle RewriteCond et d'une règle RewriteRule : le serveur pourra ainsi distinguer facilement les domaines car la redirection ne fonctionnera que si vous entrez depuis l'ancien domaine. Blocage efficace des HotLink Tout le monde ou presque, qui place des fichiers à télécharger sur un site Web, connaît 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 achète un serveur où il place les fichiers, destinés à télécharger de son site ; une personne d'un autre service ajoute tout simplement les mêmes liens sur son site, ce qui entraîne une augmentation du transfert sur le compte du webmestre qui a acquis le serveur. Les liens menant à ce serveur sont surchargés ; de plus, certaines sociétés d'hébergement définissent des limites mensuelles du transfert du compte ; si la limite est dépassée, le site est suspendu. Afin de se protéger contre ce phénomène, il faut installer un blocage de HotLinks. De nombreux blocages fonctionnant au niveau de PHP ont été conçus et implémentés jusqu'à présent. Les blocages les plus efficaces étaient ceux qui vérifiaient le serveur recommandant (donc celui où on cliquait sur le lien) et comparaient son adresse à l'adresse de la vitrine donc le propriétaire a placé ses fichiers ; ils utilisaient également la réécriture des liens afin de cacher les fichiers à télécharger en exécutant en même temps le script. Malheureusement, ces blocages avaient un défaut : si l'on connaissait les vrais chemins de fichiers, le script ne se lançait pas et on pouvait télécharger le fichier sans aucun problème. Mod_Rewrite vous vient ici aussi en aide. Il permet en effet d'améliorer la méthode décrite. Il suffit de créer le fichier 5 Fiche technique mod_rewrite .htaccess et de le placer ensuite dans le répertoire à protéger : RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+\ .)?page\.com [NC] RewriteRule ^.*\.(zip|exe|rar|gz|tar .gz|tar)$ http://www.page.com/ HotLink.html [L] Grâce à la commande RewriteCond susmentionnée et aux expressions régulières, il est possible de déterminer facilement la condition d'exécution des règles pour les serveurs recommandants : les règles (qui redirigent tous les HotLinks sur la page informant que la démarche est interdit) sont exécutées seulement si l'adresse du serveur recommandant vérifiée par HTTP_REFERER n'est pas votre adresse. Pour éviter le problème qui peut apparaître avec l'utilisation du préfixe www, utilisez l'expression régulière (.+\.)?, permettant de ne pas se préoccuper du préfixe. Remarquez que nous avons placé le point d'exclamation avant votre adresse (page.com) : il signifie la négation dans le langage des expressions régulières. La règle placée dans la ligne suivante vérifie, d'après l'extension du fichier, s'il est possible d'y éditer des liens. Si cette extension (décrite avec l'expression ré- Tableau 1. Réécriture des adresses qui commencent par le mot gallery Adresse Adresse réelle gallery/valeur2/valeur3 ou gallery/valeur2/ valeur3/ index.php?module=gallery&function=wartość 2&id=wartość3 gallery/valeur2 ou gallery/valeur2/ index.php?module=gallery&function=warto ść2 gallery ou gallery/ index.php?module=gallery gulière .*\., donc n'importe_quel_ caractère.caractères_derrière_le ; attention à l'échappement du caractère 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 décrite est très utile mais elle a un défaut : lorsque vous saisissez l'adresse du fichier dans le navigateur (vous la recevrez par exemple en courriel ou par la messagerie instantanée), le blocage HotLink fonctionnera et vous ne pourrez pas télécharger le fichier. Et l'idée du blocage ne consiste pourtant pas à rendre difficile la vie de simples utilisateurs mais des propriétaires des services qui surchargent vos bandes ! Afin de résoudre ce problème, il est possible de modifier le code de manière suivante : point RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+\ .)?page\.com [NC] RewriteRule^ .*\.(zip|exe|rar|gz|tar.gz Tableau 2. Réécriture des adresses qui commencent par le mot news Adresse news/valeur2/valeur3 valeur3/ Adresse réelle ou news/valeur2/ index.php?module=news&action=valeur2&i d=valeur3 load&file=$1 [L] Il redirigera l'utilisateur à l'adresse : news/valeur2 ou news/valeur2/ index.php?module=news&action=valeur2 index.php?page=download&file=nom_du_fichier news ou news/ index.php?module=news où vous placez le script PHP qui sert à télécharger les fichiers (nous ne le précisons pas dans l'article car il peut s'agir de n'importe 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 télécharger depuis votre site : le blocage de HotLinks ne l'empêchera pas cette fois-ci de le faire. L'adresse utilisée ici n'est qu'un exemple et il faut l'adapter à votre propre service. Vous pouvez employer le blocage de HotLinks décrit avec les fichiers graphiques, ce que font en général les entreprises proposant l'hébergement gratuit. Tableau 3. Réécriture des adresses qui commencent par le mot différent de gallery et news Adresse Adresse réelle valeur1/valeur2/valeur3 ou valeur1/valeur2/ valeur3/ index.php?module=wartość1&option=valeur 2&id=valeur3 valeur1/valeur2 ou valeur1/valeur2/ index.php?module=valeur1&option=valeur2 valeur1 ou valeur1/ index.php?option=valeur1 Listing 4. Ensemble de règles correct pour créer 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] 6 |tar)$ http://www.page.com/index.php?page=down www.phpsolmag.org Réécriture des adresses URL (liens conviviaux) Mod_Rewrite permet également de réécrire les liens. De nombreuses personnes se sont étonnées en voyant sur un site Web dynamique des adresses du type gallery-photo-1.html qui masquent en réalité les adresses URL réelles (par exemple, index.php?module=gallery&function=pho PHP Solutions N° 6/2006 mod_rewrite to&id=351). Vous n'êtes pas sans savoir qu'aujourd'hui, si une page Internet veut remporter un succès, elle doit avoir une bonne position sur les moteurs de recherche, comme Google. Le lien qui commence par index.php avec de nombreuses variables n'est convivial ni à l'utilisateur ni au moteur de recherche parce qu'il contient les caractères qui ne sont pas appréciés, comme le point d'interrogation et l'esperluette (&). Les pages avec de telles adresses URL ne sont guère indexées ou sont indexées lentement. De plus, les systèmes CMS (en anglais Content Mana- gement Systems : systèmes de gestion de contenu) utilisent souvent les identifiants de session dans les adresses URL (les moteurs de recherche et les navigateurs n'acceptent guère 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 Grâce à Mod_Rewrite, il vous est possible de rendre l'adresse de votre site plus Listing 5. Nous gardons le schéma de liens avec des paramètres différents 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 règles 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] PHP Solutions N° 6/2006 www.phpsolmag.org Fiche technique attrayante pour les moteurs de recherche (et les utilisateurs qui aiment noter ou retenir les adresses URL) et de supprimer l'identifiant de session des liens. Dans un premier temps, sachez qu'un code prêt, 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=va leur2&id=valeur3 en adresses réécrites, 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.p hp?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 toujours une adresse URL conviviale). Nous ne voulons pas et nous ne créerons pas les répertoires appelés gallery, photo ou 21. Mod_Rewrite permet aussi de faire simuler des noms de fichiers et de répertoires : créez 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 règle ci-dessus, vous avez utilisé trois drapeaux indiquant notamment que les adresses étaient insensibles à la casse (drapeau NC) et que la réécriture ne se terminait pas avec une seule règle (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'adresse http://www.mondomaine.pl/galLeRy/ phOtO/21 seront correctes. L'expression régulière ([^-]+) permet en revanche d'ajouter n'importe quel mot. Tout fonctionne bien mais en êtesvous sûrs ? Que se passerait-il si vous saisissez seulement gallery/photo/ dans l'adresse, sans préciser le numéro de la photo ? Vous verrez alors le message d'absence du répertoire parce que la règle présentée ne décrit que les adresses URL à trois niveaux. Le Listing 4 présente le code qui permet de résoudre ce problème. Dans ce cas-là, la hiérarchie de règles est importante : l'ordre de règles doit être préparé de sorte que les règles ne 7 Fiche technique mod_rewrite Tableau 4. Règles réécriture des adresses de galerie simulant des fichiers HTM Adresse Adresse réelle 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. Règles de réécriture des adresses de news simulant des fichiers HTML Adresse Adresse réelle 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. Règles de réécriture d'autres adresses (ni news ni galerie) simulant des fichiers HTML Adresse Adresse réelle 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 se dérangent pas mutuellement. À titre d'exemple, si la première 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 définir les règles dont le nombre des niveaux est le plus élevé. Faites aussi attention au drapeau QSA dans la dernière règle. Cette règle ne fonctionnerait pas sans ce drapeau parce que l'expression régulière ([^-]+) ne peut pas exister seule si RewriteBase n'a pas été défini. Il est donc possible d'utiliser votre ensemble de règles d'une autre manière, par exemple, si l'utilisateur ne précise 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 thématique de photos) ou redirigé à l'adresse /gallery. Cette démarche permet de rendre plus souple la fonctionnalité de votre service. Remarquez également qu'avec trois niveaux, vous avez définit 6 règles alors qu'une règle suffirait en principe pour chacun d'entre eux. Observez attentivement les trois premières règles et vérifiez quelles sont les différences avec les trois autres (sans prendre en compte QSA dans la dernière ligne). Dans les trois premières règles, le signe de slash (/) se trouve à la fin de la dernière expression, ce qui n'est pas le cas des trois autres rè- 8 gles ; grâce à cette démarche, les adresses 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'empêche de garder le même schéma de liens (par exemple, valeur1/ valeur2/valeur3) avec les paramètres différents (par exemple, gallery/valeur1/ valeur2 versus news/valeur2/valeur3). Regardez le Listing 5. La valeur du fichier .htaccess y présentée permet de garder le schéma susmentionné valeur1/ valeur2/valeur3 indépendamment des variables transmises. Comme vous pouvez le remarquer, l'ensemble de règles prévues pour la galerie se trouve en haut de la hiérarchie. L'ensemble est organisé de sorte qu'il fonctionne seulement quand le premier pseudo-répertoire (ici, valeur1) indique le mot gallery. Dans ce cas-là, Mod_Rewrite réécrit les adresses d'après le schéma du Tableau 1. Le deuxième ensemble fonctionne seulement quand le premier pseudo-répertoire indique le mot news. Dans ce cas-là, les adresses ressemblent à 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 dépend de la structure de la page. www.phpsolmag.org De plus, si le premier mot de l'adresse n'est ni gallery ni news, les adresses sont réécrites comme le présente le Tableau 3. Dans ce cas-là, la variable option se distingue dans l'adresse. Mentionnons ici de nouveau la hiérarchie de règles. Si vous placiez le dernier ensemble de ce fichier avant les ensembles news et gallery, toutes les adresses y seraient soumises ; autrement dit, la variable option serait toujours transmise en deuxième paramètre parce que, par exemple, les adresses gallery/photo/341 et news/ read/53 correspondent à ce schéma et elles seraient y comparées au tout début. Lorsque, toutefois, ce schéma se trouve à la fin du fichier, les adresses sont comparées dans un premier temps aux premiers ensembles et ensuite, au cas d'échec, au dernier ensemble. Les adresses réécrites ne doivent pas forcément ressembler aux répertoires. Il est possible d'utiliser Mod_Rewrite de sorte que les adresses soient masquées sous forme des fichiers HTML, ce qui est davantage impressionnant. Le schéma valeur1/valeur2/valeur3 se présenterait en général ainsi : valeur1-valeur2valeur3.html, par exemple, gallery-photo21.html. Afin d'obtenir cet effet, il faut restructurer l'ensemble de règles précédant dans le fichier .htaccess, ce qui n'est pas difficile (Listing 6). Comme vous le voyez, le nombre de règles a diminué parce que les principes supplémentaires étaient présents dans l'exemple précédent ; ces principes permettaient par exemple de terminer l'adresse par un slash (/), quoique ce ne soit pas obligatoire. Cette fois-ci, les slashs ne sont pas employés : ils sont remplacés par les tirets ; à la fin, se trouve le suffixe .html, remplaçant en quelque sorte l'extension du fichier. Comme nous l'avons mentionné, il est nécessaire de placer la barre oblique inversée (\) avant les caractères spéciaux ; c'est pour cette raison qu'elle se trouve devant le point. Grâce au fichier .htaccess du Listing 6, les adresses URL se présentent comme dans les Tableaux 4, 5 et 6. En conséquence, tout fonctionne de la même manière qu'avec les adresses du style répertoire. Supprimer l'identifiant de la session Comme nous l'avons mentionné, même les adresses URL le mieux structurées ne seront pas efficaces (pour le position- PHP Solutions N° 6/2006 mod_rewrite nement des pages dans les moteurs de recherche), si vous ajoutez l'identifiant de session aux liens. En conséquence, au lieu de ressembler à gallery/photo/21 et gallery-photo-21.html, vos adresses se présenteront ainsi : gallery/photo/21?PHPSESSID=accfcc299077b3 6817dc534c90588253 une sous-page indexée avec l'adresse tintin_part_en_aventure.html ou news/ tintin_part_en_aventure (parce que, par exemple, vous avez une vitrine consacrée aux bandes dessinées), vous pouvez êtes sûrs que Google traitera votre page mieux que les autres. Pour obtenir une telle adresse, il suffit d'ajouter une simple règle au fichier .htaccess : ou bien : gallery-photo-21.html?PHPSESSID=accfcc29 RewriteRule ^news/(.*)$ index.php?module 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 caractères qui rallonge l'adresse URL. Ce problème survient bien évidemment seulement quand le service donné utilise la fonction de sessions en PHP. Pour que les moteurs de recherche n'ajoutent pas le numéro 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 paramétrée globalement sur on dans la configuration du serveur et il est impossible de la modifier localement. Il ne vous reste alors qu'à demander à l'administrateur de paramétrer cette option localement en off. Utilisation pratique de Mod_Rewrite dans les systèmes CMS En pratique, Mod_Rewrite a de nombreuses applications dans les systèmes du type CMS. Nous citerons et analyserons les systèmes les plus populaires. Titres des sous-pages ou des articles dans les adresses URL Bien que les liens conviviaux ne soient pas la clé à un grand succès 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 préparer les adresses contenant les noms des sous-pages, les titres d'actualités, etc. Si un internaute saisit alors la phrase Tintin part en aventure sur Google et vous avez PHP Solutions N° 6/2006 =news&name=$1 ou bien, dans le cas des liens avec le suffixe .html : RewriteRule ^news-(.*)\.html$ index.php?m odule=news&name=$1 L'expression régulière (.*) permet d'enregistrer n'importe quelle suite de caractères (y compris, des espaces) ; en théorie, il est donc possible de noter l'adresse sous forme de news/Tintin part en aventure, bien que cette solution ne soit pas conseillée parce que les navigateurs et les moteurs de recherche interprètent les espaces de manières différentes. L'exemple susmentionné peut déjà fonctionner à condition que le système CMS sur votre vitrine soit capable de trouver l'article d'après le nom contenu dans la variable, sans ID. Les systèmes CMS, pourvues des fonctions du type GetIdFromName(nom), ne sont pas nombreux et nous ne voulons pas les analyser en détails en ce moment. Il y a un autre problème concernant l'exemple ci-dessus, à savoir les caractè- Fiche technique res spéciaux et les caractères nationaux, les accents (par exemple, français ou italien), les Umlaut allemands, etc. Il est conseillé de changer les caractères spéciaux en tirets, les caractères nationaux en version latine. Remplacez les espaces par les tirets bas (_) et changez toutes les lettres en minuscules. Grâce à la fonction replace_titles(), écrite en PHP et présentée sur le Listing 7, il est possible de modifier la phrase Un petit hérisson mange une pomme pourrie en un_petit_hérisson_mange_une,_pomme_pourrie. Nous avons expliqué le fonctionnement de cette fonction dans les commentaires. Il est bien évidemment possible d'agrandir ou d'adapter à d'autres langues le tableau avec les caractères. Il est très facile d'utiliser cette fonction dans le système CMS. Supposez que le fichier news.php est chargé d'afficher les actualités. Premièrement, il faut placer cette fonction au début de ce script. Deuxièmement, il suffit de trouver le modèle du lien (supposons que CMS n'utilise pas le système de modèles mais les simples variables PHP pour déterminer le modèle des liens) qui se présente plus ou moins ainsi : <a href=”index.php?module=news& id=<?=$id?>”><?=$title?></a> Il faut le modifier en modèle, permettant de créer des adresses URL conviviales à l'aide de votre fonction. Utilisez-la de manière suivante pour les adresses simulant les répertoires : Listing 7. Fonction replace_titles(), chargée de modifier la taille des lettres et de supprimer les caractères nationaux <?php function replace_titles($text){ // tableaux $search =array(' ', '/', '\'', '&', '%', 'ć', 'ś', 'ą', 'ż', 'ó', 'ł', 'ś', 'ż', 'ń', 'ę',); $replace=array('_', '-', '-', 'and', 'procent', 'c', 's','a', 'z', 'o', 'l', 's', 'z', 'n', 'e',); } ?> // Modifier toutes les lettres de string en minuscules $text = strtolower($text); // Modifier toutes les lettres de string en caractères html $text = html_entity_decode($text); // Modifier les caractères des tableaux $text = str_replace($search, $replace, $text); // Retourner le texte nettoyé sans les caractères spéciaux et nationaux return $text; www.phpsolmag.org 9 Fiche technique mod_rewrite <a href=”news/<?=$id?>/<?= replace_titles($title)?>”><?= $title?></a> [pas propre comme code ! <?php ... ?>, un echo général serait plus claire] En revanche, pour les adresses ne simulant pas les fichiers, le modèle se présentera ainsi : <a href=”news-<?=replace_titles( $title)?>-id<?=$id?>/”><?=$title?></a> Votre schéma avec les adresses de répertoires se présente ainsi : news/ID/ nom_du_ news et avec les adresses de fichiers, ainsi : news-nom_du_news-idID.html. À présent, afin de terminer cet ouvrage, ajoutez la règle suivante (pour le schéma de répertoires) 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 deuxième paramètre peut constituer n'importe quelle suite de caractères et il n'est pas nécessaire de le transmettre parce que seul ID suffira pour reconnaître l'actualité. Voici la même règle pour le schéma de fichiers : RewriteRule ^news-(.*)-([^-]+)\. html$ index.php?modul=news& id=$2 [L,NC,NS] Cette règle ne transmet que l'ID à la variable id mais cette fois-ci, il se trouve dans le deuxième paramètre et il est donc transmis comme $2. Rappelons qu'il n'est pas nécessaire d'utiliser le paramètre $1. Nous ne préciserons pas de nouveau les tables avec les exemples de réécriture des adresses parce qu'il est facile de le faire soi-même. Nous avons utilisé bien évidemment les exemples de test – si vous voulez les implémenter dans les systèmes CMS fonctionnant, il faut avoir des connaissances en PHP. Utilisation des liens conviviaux dans les systèmes CMS populaires Nous vous présenterons maintenant comment implémenter les adresses URL conviviales dans les CMS populaires, basés sur la plate-forme Nuke (PostNuke, MDPro, PHP-Nuke, enVolution, 10 etc.). Elles sont compatibles avec le module de génération de layout, appelé AutoTheme (MDPro et PHP-Nuke en sont même dotés dans l'installation standard). Actuellement, c'est le système de modèles des CMS le plus souvent utilisé. Ce module permet d'activer les liens conviviaux dans les paramètres. Malheureusement, il ne s'agit que des liens du style fichier ; heureusement, il est possible de sélectionner le suffixe (vous avez au choix par défaut .html, .htm et .phtml). Après avoir lancé la modification des liens en liens conviviaux, il suffit de copier l'un des fichiers .htaccess dans le répertoire 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 répertoire principal de la page et modifiez son nom en .htaccess. Après cette opération, les schémas par défaut des liens conviviaux fonctionneront. Notre objectif consiste toutefois à décrire comment transformer ces schémas et les paramétrer de sorte que les liens aux actualités contiennent les noms de ces actualités. Les systèmes de portail susmentionnés contiennent le fichier funcs.php dans le répertoire modules/News/. Il est chargé de générer les liens dans le système d'actualités. Ouvrez-le et placez-y la fonction de remplacement de titres décrite ci-dessus (replace_titles()) du Listing 7, après le commentaire de l'auteur. Ensuite, trouvez le commentaire dans le fichier funcs.php : // Allowed to read full article? et placez derrière : $nazwa_newsa = $fullarticle = $news_name.'-id'. $info[sid].'.html'; Grâce à cette démarche, le lien à l'actualité se présente ainsi : nom_du_newsid31.html où le chiffre 31 est un exemple d'ID de l'actualité. Il faut bien évidemment modifier le suffixe .html en suffixe sélectionné. Il ne vous reste qu'à ajouter la règle à votre fichier .htaccess ; elle devrait se trouver la première : 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 régulière, permettant d'ajouter seulement un chiffre donné. De plus, il est possible de modifier le schéma de génération de liens par défaut en AutoTheme. Il s'agit par défaut des équivalents anglais des modules qui fonctionnent avec ces CMS. Afin de les modifier, ouvrez le fichier modules/ AutoTheme/extras/nom_du_système_ cms-utilisé/autourls.ext.php. Vous verrez dans ce fichier deux tableaux : $search et $replace ainsi que la fonction preg_replace(), chargée de modifier toutes les adresses d'après les expressions de tableaux. Pour modifier le schéma des liens, il faut donc modifier les tableaux ; ils se correspondent d'après le principe suivant : la première position du tableau $search est changée en première position du tableau $replace, la deuxième position en deuxième, etc. ; pour cette raison, les deux tableaux ont le même nombre de positions. Nous vous expliquerons l'édition sur l'exemple d'une des positions du tableau $search : replace_titles($info[title]); La variable $nom du news appellera la fonction replace_titles() et l'utilisera pour le titre de l'actualité précisée 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 définition de la variable $fullarticle en dessous de ce code. Changez la ligne avec cette définition en : www.phpsolmag.org $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\.\:\_\/]+) ; après le traitement par la fonction preg_replace(), le résultat de cette expression est marqué par le nom $1. Il faut le placer dans le tableau $replace. L'entrée dans ce tableau $replace se présentera donc ainsi : '”changelang-$1.'.$autourlsext.'”', PHP Solutions N° 6/2006 mod_rewrite La variable $autourlsext signifie le suffixe. Nous n'allons pas cependant décrire en détails les modifications des CMS et leurs modules, nous nous arrêtons 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 caractère & par l'expression &(?:amp;)?, qui est une condition du type ou : elle fonctionnera si le lien contient le caractère & et & (version correcte). Il faut remplacer Valeur1 et valeur2 par l'expression ([\w\ d\.\:\_\/]+) et placer les caractères "| à la fin de la position. L'ensemble doit se présenter ainsi : Fiche technique Tous ces exemples ont été testés sur plusieurs serveurs et fonctionnent correctement. Si jamais l'un d'entre eux ne retourne pas le résultat attendu, la faute est au serveur. Tout dépend en effet de la configuration de Mod_Rewrite sur le serveur et elle peut être erronée. N'oubliez pas que le module Mod_ Rewrite est puissant et il est impossible de décrire toutes ses fonctionnalités dans un seul article, voire dans un seul numéro du magazine. Nous vous souhaitons donc d'avoir des règles correctes, des utilisateurs satisfaits et des positions élevées dans les moteurs de recherche grâce à Mod_Rewrite. n $prefix.'index.php\?module= ([\wd\.:\_/]+)&(?:amp;)? file=([\wd\.:\_/]+)”|' Pour que tout fonctionne correctement, il faut modifier les règles dans le fichier .htaccess de sorte qu'elles correspondent aux positions du fichier autourls.ext.php. Nous espérons qu'il n'y aura pas de problème avec cette démarche. Vous pouvez voir le résultat de l'utilisation des liens conviviaux dans le système CMS sur le site officiel de CMS : PostNuke, http: //www.postnuke.com/. Conclusion Nous vous avons présenté comment employer en pratique les règles Mod_Rewrite et les décrire à l'aide des expressions régulières. Les exemples utilisés devraient vous servir des conseils à suivre. SUR INTERNET • • • • • • http://httpd.apache.org – Site officiel de Apache http://httpd.apache.org/docs/1.3/ mod/mod_rewrite.html – Documentation 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 expressions régulières http://www.regular-expressions.info/ – Vitrine sur les expressions régulières PHP Solutions N° 6/2006 www.phpsolmag.org 11