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&amp;
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
&amp; (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

Documents pareils