|
|
|
Réécriture de base avec Apache mod_rewrite Rôle des fichiers .htaccessDans toutes les situations que nous considérerons par la suite, il sera nécessaire de dire à Apache quel comportement nous voulons qu'il utilise. Pour cela, Apache se base sur l'utilisation de fichier de configuration locaux, placés dans chaque répertoires, les fichiers .htaccess. Si Apache ne trouve pas de fichier portant ce nom, il utilise sa configuration global. Sinon il suit les indications du fichier .htaccess pour traiter le répertoire en question ainsi que ses répertoire fils. Pour plus d'information sur la configuration de Apache et des .htaccess (leur portée et les droits qu'ils peuvent avoir), lire la documentation officielle sur les .htaccess. Ces fichiers .htaccess sont très simples. Il s'agit uniquement de fichiers texte. Le "." qui précède le nom est essentiel. Ne l'oubliez pas lorsque vous créerez ce fichier.Sachez que si vous placez un .htaccess dans un répertoire, il prend l'ascendant sur la configuration de base, ou sur la configuration d'un répertoire parent. Ces fichiers .htaccess servent par exemple à configurer vos pages d'erreur 404 ou à empécher l'affichage du contenu d'un dossier. Dans la suite de ce tutorial nous supposerons que vous utilisez un .htaccess à la racine (virtuelle) de votre site web (c'est-à-dire que le fichier se trouve à l'adresse http://votre_site.fr/.htaccess). Dans un autre cas (par exemple http://votre_site.fr/blog/.htaccess) faites bien attention à la remarque concernant la notion "RewriteBase" dans la suite du tutoriel. Démarrer le moteur de ré-écriture (Rewrite Engine)Avant de pouvoir ré-écrire (URL rewriting) vous activez une option préalable dans le .htaccess : FollowSymLinks. C'est une propriété de sécurité du module de ré-écriture et vous ne pourrez pas modifiez vos URL sans cette option. Dans la plupart des cas elle a déjà été activée dans la configuration globale du site (http.conf ou apache2.conf), mais il est toujours sage de l'ajouter au début de votre fichier. De manière additionnelle (à retirer selon certains serveurs), vous devez activer l'option Indexes . Enfin, vous devez activer le module pour un fonctionnement sur l'ensemble des fichiers de votre configuration. Voilà donc à quoi ressemble un fichier .htaccess de base pour faire fonctionner la ré-écriture : Options +FollowSymLinks Options +Indexes RewriteEngine On Définir l'adresse de base (RewriteBase)Cette commande permet de dire à apache à partir de quelle adresse web vous souhaiter ré-écrire vos URL. Si votre .htaccess se trouve à la racine du site ( c'est-à-dire accessible par l'adresse http://votre_site.fr/.htaccess) vous n'aurez à écrire que : RewriteBase / Sinon, si votre .htaccess se trouve dans le répertoire 'blog' (par exemple), vous devrez modifier la ligne précédente en : RewriteBase /blog/ Cette ligne s'insère juste après les trois précédentes. Les règles de syntaxe de mod_rewriteRé-écrire une seule adresseLes ré-écriture sont faites selon les règles que vous spécifiez. Une règle se créée selon la syntaxe suivante : RewriteRule SOURCE DESTINATION Les demandes vers "source" seront ré-écrites en "destination". Nous allons voir par la suite que "source" peut être le nom d'un fichier (sans l'adresse http://votre_site.fr devant) ou un nom générique regroupant plusieurs fichiers en fonction d'une expression régulière. Commençons par un exemple simple. Vous possédez deux pages : perimee.html et actuelle.html. Vous voulez que l'utilisateur atteigne la page actuelle même lorsqu'il tape l'ancienne adresse de la page périmée (souvent le cas lorsque les liens proviennent d'un site externe qui n'a pas mis à jour les liens versvotre site). La ligne de ré-écriture sera la suivante : RewriteRule perimee.html actuelle.html Votre premier .htaccess ressemblera alors à cela : # Mise en place de la ré-écriture Options +FollowSymLinks Options +Indexes RewriteEngine On # Adresse de base de réécriture RewriteBase / # Règles de ré-écriture RewriteRule perimee.html actuelle.html Voilà l'exemple : page perimee.html Vérifier l'adresse du lien, puis l'adresse de la page une fois chargée. L'adresse reste la même une fois chargée, mais la page chargée est nouvelle. Pour ré-écrire le nom de l'ancienne adresse, il faut utiliser une redirection. On évitera alors le duplicate content (référencement multiple par google, qui est mauvais pour son classement). Ré-écriture pour plusieurs pagesSi vous désirez ré-écrire un nombre conséquent de pages web, il ne va pas être facile de remplir une à une toutes les redirections. C'est la raison pour laquelle nous allons utiliser des expressions régulières. Vous en connaissez peut être certaines par convention. Par exemple, le caractère '*' est un joker (wildcard en anglais) pour signifier "n'importe quelle caractère en nombre indifférent". En gros * remplace "tout et n'importe quoi". Les expressions régulières sont très puissantes et sont à la base d'une bonne ré-ériture. Pour ceux qui sont habitués à l'utilisation des expressions régulières, vous pouvez continuer l'article, sinon, parcourez notre tutoriel sur les expressions régulières avant de lire la suite de l'article. Considérons un cas banal : vos articles sont stockés dans une base de donnée, et un script php les affiche en fonction de la demande. La page article.php prend en argument une variable ID correspondant à l'article demandé, et cette variable est passée en GET (c'es-à-dire dans l'adresse URL). Ainsi, les visiteurs liront l'article 12 en accédant à la page http://votre_site.fr/article.php?id=12. Nous allons voir comment rendre l'URL d'accès plus esthétique en utilisant l'URL rewriting, par exemple : http://votre_site.fr/article/12 . En appliquant la règle de ré-écriture vue ci-dessus, le .htaccess contiendrait la ligne suivante : RewriteRule ^article/12$ article.php?id=12 Vous voyez apparaitre ici deux caractères non présents dans l'exemple du haut : ^ et $. L'utilité de ces caractères vous est expliqué sur la page dédiées aux expressions rationnelles. Pour faire bref, si nous avions simplement écrit : RewriteRule article/12 article.php?id=12 L'URL http://votre_site.fr/sous-article/123 aurait aussi été transformé, entraînant des problèmes de redirection et des instabilités. Nous utiliserons donc à présent les caractères de délimitation ^ et $ afin d'être assuré de bien choisir les chaînes de caractères voulues. A présent on remarque que cette redirection marche uniquement avec l'article 12 : que se passe-t-il si notre site contient des centaines d'articles? Nous pouvons bien sûr améliorer la ligne pour traiter génériquement les articles de notre site. C'est à ce niveau là que la puissance des expressions régulières est utile : RewriteRule ^article/([0-9]+)$ article.php?id=$1 Lorsque nous plaçons des parenthèses autour d'une expression régulière, nous demandons au module Apache mod-rewrite de conserver la valeur remplacée dans une variable qui s'appellera grâce à $1 (et $2 pour la deuxième parenthèse, $3 pour la troisième etc.). Nous rencontrerons plus d'exemples dans les autres articles, pour le moment une explication rapide de la nouvelle ligne : la première partie est l'adresse récupérée à partir du navigateur. Celle-ci est de la forme article/un_nombre. L'expression ([0-9]+) va récuper l'ensemble des nombres : suite de chiffres de 0 à 9 avec au moins un chiffre (à cause du +). Ce nombre est stockée dans la variable $1. L'adresse est ensuite redirigée vers la page article.php avec en argument le nombre demandé. Mais quel intérêt? Au delà de l'aspect purement esthétique et plus facile pour l'humain, l'URL rewriting a longtemps été utilisé pour aider les moteurs de recherche à indexer les pages dynamiques. En effet, lorsqu'un robot rencontrait la page article.php il la considérait comme une page unique, et ce quels que soient ses arguments. Actuellement les moteurs sont assez évolués pour reconnaitre les structures simples de pages dynamiques. Cependant, il se trouvera bien des occasions où l'intérêt se fera sentir, pour l'utilisateur ou le moteur de recherche (taper "seo" sur votre moteur de recherche préféré pour en voir les avantages). Un exemple très intéressant qui sera peut être un jour sur le site est le suivant : en SEO il est utile de placer ses mots clés dans l'adresse de la page. Ainsi, la page article/22/Mon_titre_a_mots_cle contient des mots clés que les moteurs de recherche retiendront mieux. Il n'est pas possible avec mod rewrite d'extraire les titre de vos pages pour faire les ré-écritures, mais il vous est possible de changer les liens de votre site, et de faire une bonne redirection pour que ceux-ci pointent bien vers la page en question. RewriteRule ^article/([0-9]+)/(.*)$ article.php?id=$1 Les mots clés seraient alors contenus dans la variable $2 (présence d'une deuxième paire de parenthèses). Cependant nous n'en avons pas besoin ici pour rediriger vers la bonne page. Cette deuxième parenthèse peux prendre un nombre infini de caractères quelconques (l'astérisque signifie 0 ou autant qu'on veut). Rewrite FlagsUn "flag" est une sorte de paramètre que l'on place à la fin d'une ligne de ré-écriture pour spécifier la manière dont celle-ci sera faite. Les flags usuels se trouvent ci-dessous :
Il existe encore de nombreux autres flags qui peuvent vous permettre d'accéder à des options avancées (traitement des cookies, des variables d'environnement, traitement des types mime...). Ces tags sont documentés dans la documentation officielle et ne sont pas utilisés couramment. Pour utiliser un flag il faut le placer en fin de ligne, entourés de crochets. Vous pouvez placer plusieurs flags à la suite en les séparant par des virgules. Par exemple : RewriteRule ^article/([0-9]+)/(.*)l$ article.php?id=$1 [NC,L] |
| Mise à jour le Mardi, 21 Juillet 2009 04:42 |





