Accueil > Blog > redirections 301 : c’est bien quand c’est bien fait

redirections 301 : c’est bien quand c’est bien fait

Nous sommes le 5 octobre 2013, il y a moins de 18 heures, on apprenait via Thomas ÖLIFIRENKOFF l’arrivée de la nouvelle vague de Pingouin. Suite à plusieurs analyses croisées comme unitaires, voici ce qu’il semble ressortir de cette nouvelle mise à jour : passage des pénalités via les 301 et liens non thématisés seraient de la partie.

Alors, non, les 301, c’est pas mort, je te laisse faire tourner ton cerveau pour en trouver des utilisations tordues. Ce dont je vais te parler, c’est un truc que j’ai repéré il y a un an pour la première fois, et après recherches et tests, voici les résultats que j’aurais du écrire il y a longtemps déjà.

Tu dois mettre en place une redirection 301 ? ok let’s go.

La 301 via Htaccess

La redirection par htaccess est d’une simplicité déconcertente à mettre en place, 2 lignes et c’est réglé :

### pour rediriger de manière unitaire
redirect 301 /ancienne-page.html http://www.ton-NDD.tld/nouvelle-page.html

### pour rediriger un Nom de Domaine complet
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.nouveau-NDD\.tld
RewriteRule (.*) http://www.nouveau-NDD.tld/$1 [R=301,L]

La redirection par PHP

c’est là que ça devient drôle, alors je vous montre pourquoi.

En PHP, quand on souhaite rediriger, il existe une fonction pour ça (bon, elle permet de faire bien plus que ça), c’est la fonction Header(). Cette fonction a pour particularité d’envoyer des requêtes HTTP direcement au navigateur.
Ici, il va s’agir de lui envoyer la requête HTTP de redirection. et c’est là que ça devient drôle.

/* METHODE 1 de Redirection 301 : la méthode qui foire */
header("Status: 301 Moved Permanently", false, 301);
header("Location: *ttp://www.ton-NDD.tld/page-de-destination.html");
exit();

/* METHODE 2 de Redirection 301 : la vraie, la bonne */
header('HTTP/1.1 301 Moved Permanently', false, 301);
header("Location: *ttp://www.ton-NDD.tld/page-de-destination.html");
exit();

Alors pourquoi 2 méthodes ? je ne sais pas, quand je me suis mis au PHP, j’ai lu dans mes premiers bouquins la méthode 1, puis par la suite, j’ai vu la méthode 2 dans des codes sources, sur le WEB. Et puis ton esprit se mélange, tu te dis que c’est la même, alors on fait plouf plouf et en avant.
Ben non, en faisant ça, tu vas t’en mordre les doigts.

Voilà, il y a un an, je me suis rendu compte que Google avait mal digéré ma dernière 301, qu’elle passait mal, il en devenait malade, m’affichait des résultats au delà du WTF standard, du coup, j’ai regardé le code, puis regardé encore le code, puis me suis fait prendre pour un con par un immense connard (mais bon passons, je pense qu’il connait mon amour pour lui, pas la peine d’en dire plus). Du coup, j’ai continué mes recherches, pourquoi cela ne passait pas ? pourquoi Google me faisait ça alors que j’étais en mode DEV et non pas en mode SEO.

Puis le concours Sentimancho est passé par là, en faisant équipe avec mon poloNWN préféré, on a fait quelques nuits “courtes”, et tu le sais bien, les nuits courtes sont apporteuses de fatigue, et quand on fatigue, on fait des conneries, et BAM, au lieu de faire une 301, on a fait une 302, et tout ça pour une seule petite ligne de code.

Il faut savoir qu’en PHP, une 302 ça se code presque comme une 301, comme ça :

header("Location: *ttp://www.ton-NDD.tld/page-de-destination.html");
exit();

Tu vois, à une ligne près, au lieu de faire une 301, tu fais une 302. Par défaut, une redirection est toujours temporaire, à moins que tu ne lui précises.

Et là, en plein concours, notre site qui commence à faire le même n’importe quoi que le site sur lequel je m’arrachais les cheveux… et là, ça fait TILT dans ma tronche quand je vois le code.

Oui, la méthode 1 que je cite plus haut ne me faisait pas de la 301 mais de la 302, et BIM. Mais pourquoi alors les bouquins que j’avais travaillé me parlaient de cette méthode alors qu’elle est dangereuse ?
Tout simplement parce que la syntaxe est correcte, mais que selon les configurations d’APACHE ou peut être autre problème software ou OS, la méthode de R301 n°1 foire et nous produit une belle 302.

Alors, on va pas s’alarmer non plus, ça m’est arrivé une seule fois, c’est pas non plus énorme comparé au nombre de 301 que j’ai faites, mais c’est suffisamment chiant pour s’en rappeler.

Le maître mot : toujours tester son code ou le résultat complet

Du coup, j’aurais au moins retenu une chose d’une personne (celui dont je parlais plus haut), même si les formes qu’il employait lui auraient mérité un bon coup de poing dans sa grande gueule : “ben, si t’es trop con pour pas avoir testé, c’est pas mon problème” et il avait raison, je ne peux rien dire là dessus, on n’avait pas testé nos redirections pour voir si elles faisaient bel et bien une 301….

En même temps, je ne cherche pas à me dédouaner mais, quand on teste une redirection, on vérifie si elle nous amène bien à la page de destination. T’as déjà testé les codes de retour de tes redirections ? toutes tes redirections ? ben non, moi non plus, enfin, ça c’était avant.

Parce que maintenant oui, cloakée ou pas, futile ou non, dès que je fais une redirection, direct derrière, je checke si elle me renvoit bien le bon code retour dans les entêtes.

Comment voir les entêtes HTTP ?

Pour ma part, j’utilise régulièreent Live HTTP Headers, un addon de Firefox qui me traque toutes les requêtes émises depuis mon navigateur. => https://addons.mozilla.org/fr/firefox/addon/live-http-headers/

Tu as aussi des outils en ligne comme chez WebRankInfo qui te permettront de checker vite fait si tout colle bien. => http://www.webrankinfo.com/outils/header.php

Ce qu’il faut retenir

Une bonne 301 en PHP s’écrit comme ça :

header('HTTP/1.1 301 Moved Permanently', false, 301);
header("Location: *ttp://www.ton-NDD.tld/page-de-destination.html");
exit();

Sinon, une 302, c’est comme ça :

header("Location: *ttp://www.ton-NDD.tld/page-de-destination.html");
exit();

On n’est jamais assez prudent, alors teste tes redirections, toutes, tout le temps, non tais-toi, teste.
Et si tu veux te cultiver un peu plus sur les cochonneries que l’on peut faire avec la fonction Header(), voici un bon début ici http://fr2.php.net/manual/fr/function.header.php,

=> De là tu auras plusieurs chemins, suis les tous, je pense que cela pourrait te donner des idées (surtout si tu regardes au niveau des paramètres optionnels de la fonction header() et de ses fonctions dérivées.)

Et pour le plaisir de se moquer, la fameuse redirection 410

J’ai vraiment hate qu’il fasse une vidéo pour expliquer les redirection 200 ^^

Pour info, les codes de réponses de type 4xx ne sont pas des redirections.
les codes de réponses 301 ET 302 ne sont pas des redirections définitives, seule la 301 est définitive, la 302 est temporaire.

Bon, je m’arrête, je vais faire un ulcère (encore un)

Allez, la bise et bon week end à tous ceux qui n’ont pas pris le manchot dans la figure, pour les autres, je compatie, cette fois ci, je l’ai prise de plein fouet moi aussi, d’où ma bonne humeur de la journée et mon ton doux et miéleux :p

Sauvez un dauphin albinos, partagez !!!

A propos DjibouTeaM

Check Also

Barbecue SEO Toulouse

Ce vendredi 09 juin, on se retrouve entre gens du WEB pour se faire un …

6 commentaires

  1. Bonsoir,

    Merci à vous pour cet article , très clair et très complet.
    Cependant j’ai encore un doute sur certains points concernant les redirections.
    Admettons que je veuille faire une réécriture d’url (pour la totalité de mon site).

    Dois-je utiliser des redirections 301 ?
    Ou une redirection du type :

    RewriteRule ^connexion.php$ index.php?page=connexion

    sera suffisante ?
    Dans le cas suivant, mes deux pages (les deux urls) sont accessibles.
    Est-ce considéré comme du cloaking ?

    Je vous remercie pour votre réponse.

    Bien amicalement, Yann.

    • pour le cas de la réécriture d’url, sur mes CMS persos, je rajoute une fonction en PHP qui verifie que l’URL par laquelle on est arrivé est bien l’URL rewritée, ce qui donne un truc du style :
      if ($_server[request_uri] != “nom-de-ma-page-reecrite. html”) {
      header(“http/1.1 301 moved permanently”, false, 301);
      header(location:nom-de-ma-page-reecrite.html);
      exit() ;
      }
      Du coup, si l’url rentrée n’est pas celle attendue, on fait une redirection 301 vers la bonne URL
      verifie la syntaxe au cas où, je reponds de tête depuis mon telephone, mais dès que j’ai un peu plus de temps, je te recontacte pour en rediscuter plus longuement 😉

      • Bonsoir,

        Merci de ta réponse. Je vais mettre en place ceci ce week-end alors.
        Je pensais qu’on pouvais faire ceci directement via htaccess.
        En modifiant la ligne de réecriture par exemple.

        En tout cas, merci beaucoup. Ca m’évitera les soucis.

        Amicalement, Yann.

      • Je te conseil de faire attention avec cette fonction, tu ralenti vachement la vitesse surtout quand tu as beaucoup de visiteurs

      • Hello Mike, dis moi, de quelle fonction parles-tu ? le header() ?

        Je vais pousser plus loin dans ce cas. Merci pour l’info

  2. Ah cette fameuse 302. Sur le coup on a pas tellement rigolé hein ^^
    Mais au final ça s’est vite rétabli et on a plutôt géré face aux poids lourds pour ce concours.

    HTTP Headers est un must have, sinon perso j’utilise beaucoup http://web-sniffer.net/