Quoi de pire que de faire une recherche sous Google, trouver ce que nous cherchions et au moment où l’on clique, une page 404 qui apparait. La plupart des internautes reviendra sur la page des résultats de Google et continuera son chemin, sans plus d’attention que cela à votre site dans le meilleur des cas. Pourtant, cela aurait pu être évité , et simplement qui plus est, en mettant en œuvre les redirections 301. Les redirections 301 indiqueront à Google que le contenu d’une page a été redirigé de façon permanente d’une page vers une autre. Bien qu’Apache ne soit pas le seul dans son domaine à pouvoir accomplir ce type de tâche, nous verrons comment mettre en place les redirections 301 uniquement avec Apache par conviction 😉
Matt Inman, dans un article parut chez SEOmoz, nous dresse un tableau large de la manière d’utiliser les redirections 301 avec Apache sans être trop technique.
Traduction de l’article de Matt Inman, Guide to applying 301 redirects with Apache
La problématique
seomoz.org était hébergé sous le domaine www.socengine.com/seo/ plutôt que sous un nom de domaine lui étant propre. Nous voulions que seomoz.org soit hébergé sous un serveur lui étant propre et accessible à partir de son propre nom de domaine et non comme étant le sous-répertoire de socengine.com. Nous voulions que toutes les personnes qui cherchaient n’importe quelle page de www.socengine.com/seo soient automatiquement redirigées vers www.seomoz.org. La redirection devait également prendre en compte des changements de noms de certains répertoires et fichiers et être faite à l’aide de la redirection de type 301. Cela dans le but d’être compatible avec les moteurs de recherche et tous les navigateurs web du marché. Nous avions également besoin de rediriger http://seomoz.org vers http://www.seomoz.org pour des raisons esthétiques et dans le but d’éviter un sabotage 301.Un bon hébergement WordPress vous donnera accès à ce type de fonctionnalités.
La solution
Une approche basique aurait consisté à ajouter des redirections de type 301dans les entêtes de fonctions Php. Toutefois, utiliser la puissance du module mod_rewrite d’Apache nous permet de faire correspondre un motif à tout un répertoire, sans avoir à manipuler chaque page Php du dit répertoire. De plus, certaines pages de notre site étaient statiques et il n’était pas pratique d’y inclure du Javascript ou des informations de redirection dans les balises META.
L’installation
Si votre serveur web ne dispose pas du module mod_rewrite, je vous suggère de vous référez à la documentation Apache pour cela. Cela requière habituellement la recompilation d’Apache avec l’option -enable-module=rewrite
ou bien --enable-module=most
.
Si votre service d’hébergement n’a pas inclus le support du module mod_rewrite, j’insisterais auprès de l’administrateur système pour qu’il le fasse. La plupart des installations Apache ont le module mod_rewrite installé par défaut. Notre serveur tourne sous FreeBSD et le module mod_rewrite était activé par défaut. Une fois installé, vous pouvez vérifier s’il fonctionne en ajoutant la ligne à votre configuration Apache ou à votre .htaccess
:
RewriteEngine On
Le contexte
Le module mod_rewrite fonctionne en contexte serveur ou en contexte répertoire.
Le fonctionnement en contexte serveur nécessite d’éditer le fichier de configuration d’Apache, httpd.conf, tandis que le fonctionnement en contexte répertoire utilise les fichiers .htacess
qui sont présents dans chaque répertoire que vous voulez configurer. Si vous ne pouvez avoir accès au httpd.conf
alors il vous faudra utiliser les fichiers .htaccess.
Les Expressions Régulières (RegExes)
Extrait de wikipedia.org
“une expression rationnelle ou expression régulière est en informatique une chaîne de caractères que l’on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise. Les expressions rationnelles sont aujourd’hui utilisées par les informaticiens dans l’édition et le contrôle de texte ainsi que dans la manipulation de langues formelles que sont les langages de l’informatique.”
Nous allons utiliser les expressions régulieres pour rechercher des motifs de l’Url appelée, afin de la rediriger comme convenu. Apprendre les expressions régulières est inestimable si on est développeur ou administrateur système. Pour rediriger des Urls comme dans les exemples donnés dans ce document, il vous faudra juste apprendre le fonctionnement de base de l’utilisation des expressions régulières. Voici une liste de caractères ou d’opérateurs que nous allons manipuler dans nos exemples :
.
Point – faire correspondre un caractère quelconque de façon unique.*
Astérisque – définit un groupe qui peut ne pas exister ou exister plusieurs fois.+
Signe plus – Défini un groupe qui existe une ou plusieurs fois avec l’élément qui le précéde.()
Parenthèse – Enfermer une valeur entre parenthèse a pour effet de stocker les valeurs correspondantes dans une variable qui peut être utilisée ultérieurement. Nous appelons aussi cela des rétro-liens.(Valeur1|valeur2)
. Inclure deux variables ou plus entre parenthèse, séparé par un opérateur de choix, |, revient à dire “correspondre à la valeurs 1 ou à la valeur 2”.
Rediriger un ficher ou un répertoire spécifique d’un domaine vers un autre
Nous avions besoin d’une redirection de notre ancien serveur vers le nouveau, en conservant les noms de fichiers tel quel.
Exemple
rediriger http://www.socengine/seo/unfichier.php
vers http://www.seomoz.org/unfichier.php
La solution
Ajouter la directive suivant dans le fichier .htaccess
:
RedirectMatch 301 /seo/(.*) http://www.seomoz.org/$1
Explication
L’expression régulière /seo/(.*)
demande à Apache de faire correspondre tout ce qui est dans le répertoire seo qu’il y ait ou non des caractères. Entourer le .*
de parenthèses, indique à Apache de conserver les caractères correspondants en tant que rétro-lien. Ces rétro-liens sont placés à la fin de l’Url vers laquelle nous redirigeons sous la forme du $1
.
Rediriger sans préserver les noms de fichiers
Plusieurs fichiers qui étaient présents sur l’ancien serveur ne le sont plus sur le nouveau serveur. Plutôt que conserver ces fichiers dans la redirection, ce qui aboutirait à une erreur 404 sur le nouveau serveur, nous allons le faire pointer sur la racine du nouveau domaine.
Exemple
Redirection de http://www.socengine.com/seo/devieuxfichiers.php
vers http://www.seomoz.org
La solution
Ajouter la directive suivante dans le fichier .htaccess
:
RedirectMatch 301 /seo/devieuxfichiers.php http://www.seomoz.org
Explication
En omettant les parenthèses, toutes les requêtes vers /seo/devieuxfichiers.php
doivent rediriger vers la racine du domaine www.seomoz.org
.
Rediriger les variables passées dans l’Url
Certains de nos scripts Php ont des noms différents mais le passage de variables reste le même. Nous avons donc besoin de rediriger le visiteur vers le bon script Php tout en conservant les variables passées dans l’Url. Le passage de variables dans l’Url vient après l’appel de la page, commence par un ? et est utilisé pour véhiculer des variables à une page web.
Exemple
Rediriger la page http://www.socengine.com/seo/detailcategorei.php?CAT_ID=12345
vers http://www.seomoz/artcat.php?CAT_ID=12345
La solution
Ajouter la directive suivante dans le fichier .htaccess
:
RedirectMatch 301 /seo/detailcategorie.php(.*) http://wwwseomoz.org/artcat.php$1
Explication
Une fois encore l’expression régulière (.*)
demande à Apache de faire la correspondance pour aucun ou plusieurs caractères et en fait une sauvegarde dans le rétro-lien $1
. Dès que l’on ajoute $1
après /seo/detailcategorie.php
, il redirigera les variables passées dans l’Url vers le nouveau script Php.
Faire une redirection en changeant les extensions de fichier
Nous avions un répertoire contenant des fichiers sur l’ancien serveur dont l’extension étaient aussi bien Html que Php. Sur le nouveau serveur, toutes les extensions sont en Php, il nous fallait donc que les Html s’adaptent au nouveau serveur.
Exemple
Rediriger les pages http://www.socengine.com/seo/guide/unfichier.html
vers http://www.seomoz.org/artcicles/unfichier.php
et http://www.socengine.com/seo/guide/unfichier2.php
vers http://www.seomoz.org/artcicles/unfichier2.php
.
La solution
Ajouter la directive suivante dans le fichier .htaccess
:
RedirectMatch 301 /seo/guide/(.*).(php|html) http://www.seomoz.org/articles/$1.php
Explication
(*.)
fait correspondre à aucun ou plusieurs caractères et stocke cette valeur dans le rétro-lien $1
. .(php|html)
dit à Apache de faire correspondre un point suivi aussi bien de “php” que de “html” et le sauvegarder dans un autre rétro-lien, que nous n’utilisons pas ici. Remarquez bien que nous avons dû utiliser le caractère d’échappement cela afin de s’assurer qu’Apache n’interprète pas ce point comme une directive des expressions régulières mais plutôt comme un vrai point. Mettre entre parenthèse Php et Html, séparé par l’opérateur de choix signifie de faire la correspondance sur l’une ou l’autre des valeurs.
En outre, s’il nous fallait conserver, pour une raison ou une autre, l’extension du fichier correspondant, il serait conservé dans le rétro-lien $2
. Les rétro-liens s’incrémentent en accord avec le nombre de parenthèses utilisées dans l’expression régulière.
Rediriger les noms de domaines canoniques
Nous avions besoin de rediriger toutes les requêtes qui ne commençaient pas avec www.seomoz.org
afin de s’assurer qu’elles incluaient bien les www. Nous avions fait cela non seulement car c’est plus esthétique mais aussi dans le but de parer au sabotage de type 301.
Exemple
Rediriger http://seomoz.org/
vers http://www.seomoz.org/
Rediriger http://mail.seomoz.org/
vers http://www.seomoz.org/
Rediriger http://seomoz.org/unfichier.php
vers http://www.seomoz.org/unfichier.php
La solution
Ajouter la directive suivante dans le fichier .htaccess
:
RewriteCond %{HTTP_POST} ^seomoz.org [NC]
RewriteRule (.*) http:www.seomoz.org/$1 [L,R=301]
Explication
Cette directive demande à Apache d’examiner sur quel domaine le visiteur tente de se connecter (dans notre cas seomoz.org) et s’il n’est pas égal à www.seomoz.org
alors il le redirige vers www.seomoz.org
.
Dans notre cas, RewriteRule les renvoient sur www.seomoz.org en préservant le fichier qu’ils tentaient d’atteindre, grâce au rétro-lien.
Conclusion
En s’attaquant à la puissance du module mod_rewrite et avec un peu de magie des expressions régulières, nous pouvons maintenant mettre au point un jeu de règle simple pour rediriger des pages internet. En utilisant les redirections de type 301 nous assurons une pleine compatibilité avec tous les navigateurs web et moteurs de recherche.
6 commentaires