La réécriture d'URL avec Apache02/09/2003 Cet article expose comment simplifier les URLs en les réécrivant avec Apache Introduction 1. Pourquoi réécrire ses liens? 2. Généralités 3. La directive ErrorDocument 4. L'option FilesMatch 5. Le module mod_rewrite d'Apache 6. Conclusion Introduction
L'utilisation de langages haut niveau, à l'instar de PHP, pour la construction de sites Web, ainsi que
l'interaction avec des bases de données forcent aujourd'hui le webmaster à assaisonner
tous ses liens d'une multitude de paramètres de configuration, d'exécution, de mise en page, et j'en passe.
On est rapidement amené à produire des liens d'une longueur astronomique et d'une complexité rare. 1. Pourquoi réécrire ses liens?Tout d'abord, par souci de clarté. Certains internautes (moi le premier) n'apprécient guère les URL incompréhensibles et à rallonge dans la barre d'adresses du navigateur. Une URL "formatée" sera beaucoup plus facile à retenir que ce type de lien. Certes, il est possible de n'afficher que le DNS quelle que soit la page demandée, mais cela diminue la pertinence des robots des moteurs de recherche.
Il est également plus intéressant de produire des liens masqués en HTML plutôt que des liens composés pour améliorer la qualité de votre référencement. En effet, certains robots sont incapables d'interpréter les liens composés. Si la proportion de ces robots s'amenuise avec le temps, il en existe encore suffisamment pour qu'on les prenne en compte. Enfin, la raison la plus flagrante de la mise en place d'un tel système est la sécurité. Lorsque vous utilisez des liens composés, on voit apparaître des valeurs, mais surtout des noms de variable, qui sont autant de portes dérobées pour entrer dans votre site. Prenons un exemple extrême pour l'illustrer: un script qui permettrait de visualiser le source d'un fichier du serveur en passant celui-ci en paramètre http://www.monsite.com/index.php?fichier=test.txt pourrait être détourné afin de récupérer un fichier système
Bien sur, cet exemple est un cas extrême et simpliste que je vous invite à ne jamais reproduire. Quand bien même la liste n'est pas exhaustive, voilà plusieurs (bonnes) raisons pour lesquelles il devient de plus en plus important d'utiliser ce type de sécurité. 2. GénéralitésPour chaque méthode présentée, on utilisera l'exemple d'un site Web contenant plusieurs rubriques, chaque d'elles contenant plusieurs pages, toutes ces pages étant accessibles en plusieurs langues, en mode navigation (normal) ou impression. Par souci de cohésion, la traduction des adresses se fera en PHP, cela dit il est possible d'utiliser d'autres langages. Les liens standards ont cette forme:
Lorsque vous utilisez l'URL rewriting, tous les liens que vous créerez sur votre site devront suivre un patron commun. Voici le schéma du nom des pages que nous voulons obtenir.
Le but de l'URL rewriting est donc d'intercepter côté serveur l'adresse de la page demandée, d'en extraire les paramètres, et de renvoyer côté client la page correspondante (qui n'a pas d'équivalent physique sur le serveur). 3. La directive ErrorDocument
Cette méthode, la plus simple, utilise la capacité d'Apache à rediriger vers une même page tous les
documents introuvables (plus connue sous le nom d'erreur 404). Créez ou éditez le fichier .htaccess à la
racine de votre serveur, et ajoutez-y la ligne suivante:
Si votre site ne se situe pas à la racine du site Web, il faut mentionner l'arborescence complète ( par
exemple ./error.php ne fonctionnera pas).
Notes: 4. L'option FilesMatch
Afin d'interdire l'accès à certains documents au sein d'un répertoire sous Apache, il est très fréquent de
faire appel à la directive FilesMatch. Cette directive permet également d'adopter un comportement selon le
"type" de fichier rencontré. Nous allons ici l'utiliser pour "diriger" les fichiers. Cette méthode est un
peu différente des deux autres, car elle ajoute obligatoirement un niveau dans l'arborescence du site. La première étape est de créer un fichier .htaccess à la racine du répertoire pour lequel on veut activer cette fonctionnalité. On y ajoute les lignes suivantes:
Cela peut se traduire ainsi: pour tout fichier dont le nom contient la chaîne exacte "html", son type MIME
est forcé à http-php. En pratique, tous les fichiers contenus dans la sous-arborescence /html/ seront
interprétés comme étant du PHP. J'attire votre attention sur l'importance de ne travailler qu'avec des
liens absolus, l'utilisation de liens relatifs (déconseillée de toutes façons ;) ) peut amener à des
incohérences.
On utilise la fonction affich_bouton dans le fichier index.php. Lorsque l'on arrive sur le site, aucun problème, puisque l'URL est http://www.monsite.com/ . A présent, cliquons sur un lien mettant en oeuvre une URL réécrite. Celle-ci est de la forme www.monsite.com/html/01_fr.html, et le script index.php utilise donc comme base www.monsite.com/html/ et pour lui, le chemin de l'image devient donc www.monsite.com/html/images/bouton.gif Comme pour la première méthode utilisée, il faut à présent définir le traitement des pages concernées par la règle sus-citée. A cet effet, il faut créer au même niveau que .htaccess, un fichier nommé html, dont le contenu sera le même que celui de "error.php" abordé au premier chapitre.
5. Le module mod_rewrite d'Apache
Le module mod_rewrite est un module standard d'Apache qui permet de manipuler les URL facilement: Brian
Moore, auteur de la documentation Apache à ce sujet, le décrit comme "le couteau suisse de la manupulation
d'URL". La première chose à faire est l'activation, si vous travaillez en local, ou si vous disposez d'un serveur dédié, du module mod rewrite: éditez votre fichier httpd.conf, et ajoutez (ou, à défaut, décommentez) les deux lignes suivantes:
Voila qui vous permet d'utiliser les règles de réécriture d'URL.
Intéressons-nous aux quelques lignes que nous venons d'écrire dans ce fichier: la première est une option
à activer, pour des raisons de sécurité. Si l'option n'est pas active chez votre hébergeur, l'URL
Rewriting peut ne pas fonctionner sur votre site.
Si on s'intéresse au motif, on peut le décomposer comme suit: on trouve quatre groupes entourés de
parenthèses, séparés par des "_". Pour comprendre en détails ces règles, utilisez un tutoriel sur les
expressions régulières, sinon, voici brièvement leur signification: Regardons à présent l'URL réécrite:
Celle-ci est en tout point commune avec une URL standard, mais au lieu de valeurs fixes pour les paramètres, on y trouve les variables créées juste avant grâce aux parenthèses. Il ne vous reste plus qu'à récupérer dans votre fichier index.php les valeurs des paramètres, et de les utiliser à votre convenance.
A la fin de la ligne subsiste une directive: [L]. Il existe une liste d'options qu'il est possible de
combiner pour chaque règle. Celle que nous utilisons ici permet de spécifier que cette règle sera la
dernière appliquée. Dans le cas présent, elle n'est pas nécessaire, mais elle le devient lorsque l'on
travaille avec plusieurs motifs.
Dans le cas ci-dessus, on teste l'existence de la page ( l'option -f permet de s'assurer que la ressource est un fichier et non un répertoire). La directive RewriteCond permet d'appliquer une réécriture seulement si la condition spécifiée (ici, %{REQUEST_FILENAME}\.cache -f ) est vérifiée. Etant donné que l'on spécifie [L] en fin de ligne, le moteur n'ira même pas lire les lignes suivantes. En revanche, si la condition n'est pas vérifiée, la ligne RewriteRule ([^.]+)\.html$ /$1.html.cache [L] n'est pas prise en compte, ce qui permet l'exécution de la ligne suivante. 6. ConclusionChacune des méthodes proposées ici permet de faire correspondre à un fichier n'ayant pas d'existence en tant que fichier physique sur un serveur Internet un contenu HTML. Si l'URL rewriting permet de renforcer la sécurité de votre site, cela n'est pas pour autant un gage d'inviolabilité, aussi pensez bien aux autres aspects de la sécurité concernant votre site Internet. Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur. |