Exemples de redirections 301 et autres via .htaccess pour réussir son SEO

En référencement naturel, on a régulièrement besoin de faire des redirections permanentes (301) 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, redirection de noms de domaines externes, etc…Certains CMS comme WordPress prévoient ça nativement ou en installant des extensions et toute la gestion se fait directement via la back-office.

Une manière de les gérer, si vous êtes sous Apache, est de créer ces règles de redirection 301 dans le .htaccess.
C’est un fichier de configuration serveur (bien plus vaste que le fait de faire des redirections 301) qui se trouve généralement à la racine de votre site et qui va permettre, dans notre étude de cas, d’envoyer une entête HTTP 301 et de rediriger le navigateur (je ne parle pas d’internaute mais de navigateur car les crawlers comme GoogleBot et les bots vont aussi être concernés) vers l’url que l’on souhaite.

Listons ensemble les règles principales qui nous permettront de gérer la plupart des cas. Je les ai toutes testées chez 1and1 chez qui est ce site; attention toutefois, en fonction du paramétrage serveur et de l’hébergeur, certaines règles ne peuvent pas fonctionner.

Note : dans la plupart des cas il faudra qu’il y ait ces deux lignes en haut de fichier avant d’insérer les codes ci dessous :

RewriteEngine On
RewriteBase /

Redirection 301 d’un url vers une autre

Le premier cas est très basique. Par exemple nous avons renommé une page http://www.example.com/page.html en http://www.example.com/page.php et nous souhaitons que la puissance des  backlinks de la page *.html ainsi que les navigateurs soient donc redirigés vers la *.php.
La règle s’écrit de la manière suivante :

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

Détaillons ce premier exemple :

  • La ligne commence par ‘Redirect permanent’ suivi d’un espace : on indique une redirection permanente (301)
    « RedirectPermanent » fonctionne aussi, au niveau de la syntaxe
  • Ensuite on indique le chemin relatif d’ancienne page suivi d’un espace
  • Enfin on indique le chemin absolu de la nouvelle page

Redirection 301 d’un 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

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 http://www.example.com ou http://example.com et l’on va mettre en place la redirection adéquate.
Dans cet exemple, on ne va pas créer 1 règle / page de notre site mais mettre en place une règle globale qui va permettre de rediriger en 301 si le site est appelé sans les www.

Version générique la plus simple :
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Version à adapter à chaque domaine :

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 :

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

Redirection 301 d’un domaine externe vers un autre domaine

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 ^(.*)$ http://www.example.com [L,R=301]
RewriteCond %{HTTP_HOST} ^www.example.fr [NC]
RewriteRule ^(.*)$ http://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

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 ^(.*)$ http://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 http://www.example.com.
La 3ème ligne représente une exclusion afin que les règles ne s’appliquent pas à la page d’accueil en elle même, autrement on rentre dans une boucle infinie

Redirection 301 de toutes les URL sauf …

RewriteCond %{HTTP_HOST} ^www.example.fr$
RewriteCond %{REQUEST_URI} !^/google4445566677.html
RewriteCond %{REQUEST_URI} !^/image.jpg$
RewriteRule ^(.*)$ http://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 en plus de désavouer certains liens (cf : outil de désaveu et Majestic SEO)

Redirection 301 toutes les URL en 404 vers une URL

Par défaut, toutes les URL qui sont en 404 seront redirigées en 301 vers la page d’accueil. 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 navigeteurs gèrent et ça ne  pose pas de problème à l’affichage pour l’internaute mais méfiance!

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

Redirection 301 https vers http

RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

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

Redirection 301 http vers https

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 codes va être de rediriger toutes les URL en http ver https (sécurisées) :

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

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 speciaux 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 ^(.*)$ http://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 ^(.*)$ http://example.com/manouvellepage.php?num=1 [R=301,L]
RewriteCond %{REQUEST_URI} ^/mapage\.php$
RewriteCond %{QUERY_STRING} ^id=2$
RewriteRule ^(.*)$ http://example.com/manouvellepage.php?num=2 [R=301,L]

J’ai redirigé mapage.php?id=1 vers http://example.com/manouvellepage.php?num=1 et mapage.php?id=2 vers http://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é sous WordPress sur des URL en 404  qui étaient crawlées 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]

Envoyer une entête 410 dès qu’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).
Le code ci dessous va envoyer du 410 dès qu’un fichier ou un repertoire n’est pas trouvé. Attention, cela fonctionnera aussi si vous avez des images, js, css, …en 404. Faites de l’analyse de logs dans ce type de cas là.

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

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)

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

One Comment

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

Post Comment