Redirections 301 dans le htaccess : exemples concrets d’utilisation en SEO

En référencement naturel (SEO), on a régulièrement besoin de faire des redirections (301, 302, …) pour ne pas perdre le jus SEO et surtout rediriger l’internaute vers la bonne page : modification d’une URL, modification de la structure du site, changement de nom de domaine ou sous domaine, etc…Avec des CMS comme WordPress on peut gérer ça facilement avec des extensions gratuites comme Redirection. : redirections 301 classiques, redirections 301 avec patterns (expressions régulières), log des 404 qui permet de voir les URL en défaut, log des redirections 301 enregistrées, etc…Bref c’est un bon début pour gérer facilement et rapidement des 301, par exemple sur des domaines expirés.

Une manière une peu plus technique mais qui permettra de fonctionner même si vous n’avez pas un site sous WordPress avec Redirection est de gérer les 301/302/404/410/… en créant des règles directement dans votre fichier .htaccess. C’est un fichier de configuration serveur qui se trouve  à la racine FTP de votre site -mais on peut aussi en mettre dans chaque répertoire pour ajouter ou remplacer les règles de base- et qui va permettre, dans notre étude de cas, de gérer tout ça pour les crawlers et bien-sûr pour les internautes.
Que vous ayez un site statique, un CMS comme WordPress ou Prestashop, toutes les redirections peuvent êtres faites du fichier .htaccess si votre serveur le permet.

Comment tester dans mon navigateur les redirections 301 / 302 et les en-têtes HTTP?

Je vous conseille deux extensions gratuites :

Listons ensemble les règles principales que j’utilise pour mes sites et mes clients et qui vous permettront de gérer la plupart des cas. Je les ai toutes testées chez plusieurs hébergeurs mais sachez que d’une configuration serveur à l’autre, il peut y avoir des syntaxes non prises en compte ou qui ne fonctionnent pas. Ces deux extensions vont vous permettre de voir ce qu’il se passe avec précisions.

Pré requis pour la gestion des redirections dans le .htaccess

Dans la plupart des cas il faudra qu’il y ait ces deux lignes en haut de fichier avant d’insérer les codes pour htaccess que vous allez découvrir plus bas.

RewriteEngine On
RewriteBase /

Redirection 301 d’une url vers une autre

Le premier cas est très basique. Par exemple nous avons renommé une page https://www.example.com/page.html en https://www.example.com/page.php et nous souhaitons faire une redirection 301 vers la nouvelle page.
La règle s’écrit de la manière suivante :

Redirect permanent /page.htm https://www.example.com/page.php

Détaillons un peu plus ce premier exemple :

  • La ligne commence par ‘Redirect permanent’ suivi d’un espace : on indique une redirection permanente (301)
    “RedirectPermanent” fonctionne aussi sur certains serveurs
  • Ensuite on indique le chemin relatif de l’ancienne page suivi d’un espace
  • Enfin on indique le chemin absolu de la nouvelle page

Mon avis

à faire pour chaque changement d’URL interne qui a des des liens (internes ou externes). Si vous avez beaucoup d’URL à traiter, il faudra peut être réfléchir à ne faire des redirections 301 que sur les pages importantes et/ou qui ont des liens et laisser les autres en 404. Pas de règle absolue mais sachez qu’il faut réfléchir avant des traitements en masse.
Bien-sûr, éviter les redirections 301 en chaine.

Redirection 301 d’une url vers la page d’accueil

Redirect Permanent /page.htm /

Dans ce cas on va rediriger la page page.htm vers la page d’accueil du domaine / sous domaine, sa racine

Mon avis

dans la plupart des cas ce n’est pas logique. On le fait régulièrement dans le cadre de domaines expirés qui sont remontés, surtout sur des mono pages, mais gardez en tête qu’une 301 est une changement d’URL donc le contenu entre la page de départ et de destination devrait traiter du même sujet. L’idée côté moteur est de transférer un maximum de Page Rank sur la page d’accueil.

Sur une démarche à long terme, il faut préférer une approche “logique” avec une similarité de sujet. Si vous souhaitez rediriger une page qui n’a pas d’équivalence, il faut essayer de trouver la page la plus proche en terme de contenu.

Redirection 301 “sans www” vers “www”

Pour éviter un maximum le DUST (lorsqu’un même contenu est accessible de plusieurs URL internes), on va choisir si l’on souhaite voir afficher notre site sous la forme https://www.example.com ou https://example.com et l’on va mettre en place la redirection adéquate.
Dans cet exemple, on va créer une règle globale qui redirige l’url exacte “sans www” vers son équivalent en “www”.

Version générique “sans www” vers “www” sans renseigner le site

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Note : ce code peut ne pas fonctionner sur certains serveurs

Version “sans www” vers “www” en renseignant le site

RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

Dans cet exemple, la première ligne va représenter une condition (comprendre “si la condition est validée alors j’exécute la règle de la ligne d’après) qui teste le ‘Host’. Si il commence par example.com, ça veut dire que j’essaye d’accéder à une URL sans avoir mis les “www”.
La ligne suivante va rediriger en 301 vers la version du site en “www” et surtout elle va faire la correspondance pour n’importe quelle URL :

  • https://example.com/ sera redirigé vers https://www.example.com/
  • https://example.com/page2.html sera redirigé vers https://www.example.com/page2.html
  • etc…

Mon avis

cela fait partie des règle obligatoires avec la gestion http / https

Redirection 301 de http vers https

Version http vers https en renseignant le site

RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ https://www.exemples.com/$1 [R=301,L]

Le comportement produit par ces 2 lignes de code va être de rediriger toutes les URL en http vers https :

  • http://mondomaine.com va rediriger en 301 vers https://mondomaine.com
  • http://mondomaine.com/categorie/ va rediriger en 301 vers https://mondomaine.com/categorie/
  • http://mondomaine.com/page.html va rediriger en 301 vers https://mondomaine.com/page.html
  • etc…

Version générique http vers https sans renseigner le site

RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Note : ce code peut ne pas fonctionner sur certains serveurs

Mon avis

cela fait partie des règle obligatoires avec la gestion sans www / www

http vers https chez Infomaniak (hebergement mutualisé)

Les deux syntaxes ci dessus ne fonctionnent pas chez l’hébergeur Infomaniak. Voici une version fonctionnelle générique :

RewriteCond %{HTTPS} OFF
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Mon avis

cela fait partie des règle obligatoires avec la gestion sans www / www

Redirection 301 de https vers http

RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

Le comportement produit par ces ligne de code va être de rediriger toutes les URL en https (sécurisées) en http :

  • https://example.com va rediriger en 301 vers http://example.com
  • https://example.com/categorie/ va rediriger en 301 vers http://example.com/categorie/

Mon avis :

la tendance est au https donc logiquement on n’a plus besoin de ce script. Je le laisse car dans certains cas il peut encore servir. J’ai certains sites satellites qui n’ont pour vocation unique que de pousser certains Money sites et qui sont chez des hébergeurs où le certificat https est payant.

Redirection 301 d’un site vers un autre

Cela arrive dans la vie d’un site de devoir changer de domaine : il va falloir rediriger en 301 les URL de l’ancien site vers leurs équivalences du nouveau site pour essayer au maximum de transférer le Page Rank vers le domaine qui doit désormais se positionner.
Si par exemple nous avons besoin de rediriger example.fr (avec et sans les www) vers www.example.com, la syntaxe sera la suivante :

RewriteCond %{HTTP_HOST} ^example.fr [NC]
RewriteRule ^(.*)$ https://www.example.com [L,R=301]
RewriteCond %{HTTP_HOST} ^www.example.fr [NC]
RewriteRule ^(.*)$ https://www.example.com [L,R=301]

Il est possible de réduire ce genre de règles en 2 lignes mais pour des questions de facilité j’ai préféré illustrer avec des morceaux de codes déjà vus plus haut.
Une erreur couramment faite est de rediriger example.fr vers example.com (sans les www) donc il y a un risque de multi redirections si vous avez définit votre domaine final avec les www.
Cela ferait par exemple http://example.fr/1.php [301 vers] http://example.com/1.php [301 vers] http://www.example.com/1.php , ce qui n’est pas forcément la solution optimale. Les règles listées ci dessus doivent se trouver dans le fichier .htaccess à la racine d’example.fr

Mon avis

cela fait partie des règle obligatoires en cas de changement de domaine. Attention à ce genre de 301 où l’on fusionne deux domaines qui n’ont rien à voir (comprendre que ce n’est pas un vrai changement de domaine ou une vraie fusion de site), ce n’est pas recommandé par Google.

Redirection 301 de toutes les URL vers la page d’accueil

RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteCond %{REQUEST_URI} !^/
RewriteRule ^(.*)$ https://www.example.com [L,R=301]

Dans cet exemple, nous allons rediriger n’importe quelle URL de example.com ou de www.example.com vers la page https://www.example.com.
La 3ème ligne représente une exclusion afin que les règles ne s’appliquent pas à la page d’accueil elle même, autrement on rentre dans une boucle infinie.

Mon avis :

dans la plupart des cas ce n’est pas logique. On le fait régulièrement dans le cadre de domaines expirés qui sont remontés, surtout sur des mono pages, mais gardez en tête qu’une 301 est une changement d’URL donc le contenu des entre la page de départ et de destination devrait traiter du même sujet. Là l’idée, la plupart du temps, est de transférer un maximum de Page Rank sur la page d’accueil.

Sur une démarche à long terme, il faut préférer une approche “logique” avec une similarité de sujet. Si vous souhaitez rediriger une page qui n’a pas d’équivalence, il faut essayer de trouver la page la plus proche en terme de contenu.

Redirection 301 de toutes les URL sauf …

RewriteCond %{HTTP_HOST} ^www.example.fr$
RewriteCond %{REQUEST_URI} !^/google4445566677.html
RewriteCond %{REQUEST_URI} !^/image.jpg$
RewriteRule ^(.*)$ https://www.example.com/$1 [QSA,R=301,L]

Dans cet exemple, je suis parti du fait que je souhaitais rediriger toutes les URLs de www.example.fr vers le .com sauf le fichier www.example.fr/google4445566677.html (fichier qui permet de valider le fait que nous soyons propriétaire d’un site auprès de Google Search Console – utile pour conserver l’accès à cet outil malgré la 301) et l’image www.example.fr/image.jpg.
Il est possible de rajouter autant de condition que vous souhaitez (lignes RewriteCond) tout en sachant que le serveur va les lire 1 par 1 de haut en bas et dès qu’une condition est validée on passe directement à la règle à exécuter ou non.
Je me suis servi de ce .htaccess sur un NDD et qui avait été salement blasté sur une page profonde : j’ai redirigé toutes les URLs sauf celle en question vers le nouveau domaine (articles en relation : outil de désaveu et Majestic SEO)

Mon avis :

dans la plupart des cas ce n’est pas logique. On le fait régulièrement dans le cadre de domaines expirés qui sont remontés, surtout sur des mono pages, mais gardez en tête qu’une 301 est une changement d’URL donc le contenu des entre la page de départ et de destination devrait traiter du même sujet. Là l’idée, la plupart du temps, est de transférer un maximum de Page Rank sur la page d’accueil.

Sur une démarche à long terme, il faut préférer une approche “logique” avec une similarité de sujet. Si vous souhaitez rediriger une page qui n’a pas d’équivalence, il faut essayer de trouver la page la plus proche en terme de contenu.

Redirection automatique de toutes les 404 en 301 vers une URL

Par défaut, toutes les URL qui sont en 404 seront redirigées en 301 vers la page d’accueil.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . / [L,R=301]

Mon avis :

Attention à ce genre de script car on ne maitrise rien : si vous avez des images, des css, js, etc.. en 404, ils seront redirigés aussi automatiquement en 301. Généralement les navigateurs gèrent et ça ne pose pas de problème à l’affichage pour l’internaute mais méfiance car au niveau du crawl des moteurs, cela peut générer des problématiques supplémentaires et inattendues.

Redirection 301 d’url avec paramètres vers une URL équivalente

Dans cet exemple on va avoir besoin de rediriger des pages qui ont des paramètres d’url. Ex :

  • ficheproduit.php?id=10
  • page.php?param=500
  • etc…

Les règles sont un peu plus complexes dès que l’on doit gérer des caractères spéciaux comme le “?”.
Je vous donne un exemple ci dessous pour rediriger toutes les pages de type mapage.php?id=[numeric] vers manouvellepage.php?num=[numeric] :

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/mapage\.php$
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
RewriteRule ^(.*)$ https://example.com/manouvellepage.php?num=%1 [R=301,L]

Si on n’a pas de pattern et qu’il faut rediriger que quelques url, on peut aussi le faire de cette manière :

RewriteCond %{REQUEST_URI} ^/mapage\.php$
RewriteCond %{QUERY_STRING} ^id=1$
RewriteRule ^(.*)$ https://example.com/manouvellepage.php?num=1 [R=301,L]
RewriteCond %{REQUEST_URI} ^/mapage\.php$
RewriteCond %{QUERY_STRING} ^id=2$
RewriteRule ^(.*)$ https://example.com/manouvellepage.php?num=2 [R=301,L]

J’ai redirigé mapage.php?id=1 vers https://example.com/manouvellepage.php?num=1 et mapage.php?id=2 vers https://example.com/manouvellepage.php?num=2

Redirection 301 d’url avec paramètres vers une URL unique

Je vous donne un problème que j’ai rencontré sur un domaine expiré qui était crawlé par Google Bot. Ex :

  • https://www.monsite.com/?p=1
  • https://www.monsite.com/?p=2
  • https://www.monsite.com/?p=3
  • etc…

Là on est sur le système de base des URL WordPress, sans re-ecriture. Pour corriger ce problème, j’ai fais une redirection 301 sur la page d’accueil, même si l’idéal aurait été de rediriger vers les URL correspondantes. Par défaut lorsque l’on redirige, les paramètres d’url sont transmis aussi. Voici un code qui permet de faire une redirection 301 vers la page d’accueil sans transmettre les paramètres d’URL :

RewriteCond %{QUERY_STRING} ^p=([0-9]*)
RewriteRule ^.*$ https://www.monsite.com/? [R=301,L]

Autre exemple :

J’ai des URL de type https://www.monsite.com/?folder=xxx , https://www.monsite.com/?page=xxx et https://www.monsite.com/?login=xxx.

On va partir du principe que les xxx sont des chaines de caractères alpha numériques. On va les traiter avec (.*), ce qui équivaut à “n’importe quel caractère”, si on traduit en Français. Gardez en tête que c’est plus consommateur de ressources que lorsque l’on recherche une pattern bien définie (Ex : ([0-9]*))

RewriteCond %{QUERY_STRING} ^folder=(.*)
RewriteRule ^.*$ https://www.monsite.com/? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=(.*)
RewriteRule ^.*$ https://www.monsite.com/? [R=301,L]
RewriteCond %{QUERY_STRING} ^login=(.*)
RewriteRule ^.*$ https://www.monsite.com/? [R=301,L]

Envoyer automatiquement une 410 quand il y a une 404

Cas client qui s’est fait pirater son site : le hacker a généré des milliers de pages supplémentaires en plus du site officiel. Même en corrigeant et en supprimant ces fameuses pages, Google met énormément de temps à les désindexer. Une solution qui accélère le processus est d’envoyer une entête 410 (gone) au lieu d’une entête 404 (not found).

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ - [L,R=410]

Mon avis :

l’idéal est de créer des règles par URL pour éviter toute 410 non voulue.
Cette solution est idéale pour une mise en place rapide mais potentiellement dangereuse : le code ci dessous va envoyer du 410 dès qu’un fichier ou un répertoire n’est pas trouvé. Cela fonctionnera aussi si vous avez des images, js, css, …en 404. Les fois où j’ai dû mettre ce genre de règles en place, je l’ai fait sur une courte période en vérifiant les logs serveur.

.htaccess pour mono page : redirections 301

Lorsque l’on monte une mono page pour du PBN avec un domaine expiré par exemple, l’idée est simple :

  1. Rediriger en 301 tous les liens profonds vers la page d’accueil (Ex : https://www.example.com)
  2. Gérer http > https ou l’inverse
  3. Gérer sans-www > www ou l’inverse

Je vous donne un exemple ci dessous où la première configuration est fonctionnelle. Reportez vous quelques blocs plus haut pour modifier selon votre besoin.

## http > https
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTPS} =off
RewriteRule ^(.*)$ https://www.example.com [R=301,L]
## non-www>www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.example.com [R=301,L]
## url inexistantes (404) > page accueil
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . https://www.example.com [L,R=301]

Mon avis :

Ce n’est pas la meilleures méthode d’après les guidelines de Google mais ça fonctionne encore bien 😉

Généralités sur le .htaccess

Pour ceux qui n’ont jamais crée ce genre de fichier :

  • n’oubliez pas qu’il doit commencer par un .
  • il doit se trouver à la racine de l’hébergement
  • préférer un encodage UTF-8 au niveau de l’éditeur (j’utilise Netbeans ou Notepad ++)

Si vous avez de questions, précisions ou demandes particulières, n’hésitez pas à laisser un commentaire.

Jérôme pasquelin - jeromeweb

Entrepreneur et Geek depuis plus de 20 ans.

Entrepreneur et Geek depuis plus de 20 ans.

6 Comments

  1. Shazam

    Mise à jour très utile avec le complément de la commande 410 qui est très peu usitée. Merci pour cet article

  2. herve

    Bonjour,
    J’ai plein d’urls qui posent problème au référencement: spam, anciennes url de worpdres qui n’est plus installé , …
    Je voudrai faire des redirections 410.
    Est-ce que ces pattern seraient bon ?
    RewriteCond %{REQUEST_URI} .*/wp-content/.*
    RewriteRule .* index.php [R=410,L]
    RewriteCond %{REQUEST_URI} .*/buy/.*
    RewriteRule .* index.php [R=410,L] ou

    redirect 410 /wp-content/

    Merci
    Bonne journée

  3. JB

    Bonjour
    pour cet article
    J’ai plusieurs pages a rediriger vers des différentes. J’ai donc fait plusieurs lignes dans le htaccess de votre code :
    Redirect permanent /page.htm http://www.example.com/page.php

    La redirection ne marche que pour la première page. une seulle page est possible? Je suis chez unetun.
    CordialementJB

  4. Bonjour,
    J’ai un fichier htaccess qui contenait

    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^exemple.com$ [NC]
    RewriteRule ^(.*)$ http://exemple.com/$1 [L,R=301]

    Etant passé au https, je souhaiterait ajouter une redirection vers https, pour obtenir :
    exemple.com . –> https://www.exemple.com
    http://www.exemple.com –> https://www.exemple.com
    http://www.exemple.com –> https://www.exemple.com

    J’ai modifié le fichier comme suit :

    RewriteEngine on
    RewriteCond %{HTTP:HTTPS} !on
    RewriteCond %{HTTP_HOST} ^exemple\.com$ [NC]
    RewriteRule ^(.*) https://www.exemple.com/$1 [QSA,L,R=301]

    Ce qui semble fonctionner, sauf lorsque je fais une recherche sur le mot clé dans google, il affiche le site avec l’adresse http://www.exemple.com,et si je clique sur le résultat de la recherche, le site s’ouvre et n’est pas sécurisé
    Cordialement

  5. jeromeweb Author

    @Shazam : merci
    @herve : je ne sais pas ce que tu veux rediriger au niveau de tes RewriteCond, du coup difficile de te répondre.
    Par contre j’ai un doute au niveau des * : pas certain que ça fonctionne dans l’état
    @jb, non, on peut mettre plusieurs règles en Redirect permanent sans que cela ne s’arrête à la première condition validée

  6. Ric

    Bonjour
    Votre code
    #Envoyer 410 au lieu d’un 404 pour toutes les URLs 404 trouvées
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ – [L,R=410]

    Ne fonctionne pas.
    Quand je l’ajoute au htacess toutes les pages de mon site renvoient un 410 et non pas uniquement les 404 :s
    Qu’ais-je fait de mal ou le code doit-il être modifié ?
    merci

Post Comment