Je suis tombé récemment sur plusieurs articles recensant les pages 404 les plus originales, créatives ou informatives. Bien que l’intention soit louable, j’ai tendance à penser que la meilleure page 404, c’est celle qu’on ne voit jamais ! Mais pour éradiquer les pages perdues, il faut d’abord les identifier. Voici une manière simple de procéder avec PHP.
Votre 404 sur mesure
La première étape consiste à signifier à votre serveur qu’il doit rediriger le visiteur vers un script personnalisé lorsqu’une erreur 404 survient. Sur un serveur mutualisé, il faudra généralement éditer les options de votre hébergement. Si vous avez la possibilité d’éditer les fichiers .htaccess (suivez ce lien si vous ne savez pas comment créer un fichier .htaccess), il vous suffit d’insérer la ligne suivant dans le .htaccess situé à la racine du site :
ErrorDocument 404 /404.php
Vous remplacerez /404.php par le nom de votre script, mais veillez à ce qu’il puisse être interprété par PHP.
Que mettre dans mon script ?
Le script aura deux fonctions : annoncer au visiteur qu’il s’est planté (je vous renvoie pour ce faire aux exemples de pages 404 remarquables en lien plus haut), et surtout, avertir l’administrateur du site qu’une erreur vient de se produire. J’ai une préférence pour les alertes par e-mail qui attirent l’attention rapidement, mais vous pouvez préférer un fichier log en mode texte ou une insertion dans une base de données, ou encore un cumul des deux. Je me concentrerai sur l’e-mail pour cette introduction.
Pour identifier l’erreur et sa cause, on veut connaître l’adresse de la page qui était demandée, et si possible l’adresse de provenance du visiteur. Si en plus, on peut avoir l’ip du visiteur et l’heure de la requête sur le serveur, on pourra corréler les données avec les logs de consultation pour les cas les plus difficiles. On se servira pour ce faire du tableau de variables global $_SERVER qui contient toutes ces infos. Voici les trois variables qui nous rendront le plus de services :
- $_SERVER['REQUEST_URI'] : l’url de la page demandée, et qui a causé une erreur 404.
- $_SERVER['HTTP_REFERER'] : l’url de la page de provenance (referer) du visiteur, quand elle est connue. Dans le cas où le visiteur a saisi à la main une adresse erronée , cette variable sera vide.
- $_SERVER['REMOTE_ADDR'] : l’adresse IP du visiteur
Envoyer le tout par e-mail
Il ne reste plus qu’à envoyer le message à l’adresse e-mail de votre choix dès que le visiteur consulte la page 404.php. Le script pourra ressembler à ça :
<?php
$email_admin = "admin@lepotlatch.org";
$monsite = "lepotlatch.org" ; // utile si vous administrez plusieurs sites
$message_titre = "[Erreur 404 " . $monsite . "] " . $_SERVER['REQUEST_URI'] ;
$message_corps = "Erreur 404 sur le site " . $monsite . ".\r\n" .
"Une page demandée n'a pas été trouvée. \r\n" .
"Url de la page : " . $_SERVER['REQUEST_URI'] . "\r\n" .
"Url de provenance : " . $_SERVER['HTTP_REFERER'] . "\r\n" .
"IP du visiteur : " . $_SERVER['REMOTE_ADDR'] . "\r\n" .
"Navigateur : " . $_SERVER['HTTP_USER_AGENT'] . "\r\n" .
"Heure de la requête : " . date('d/m/Y G:i:s') . "\r\n" .
"Contenu brut du tableau global $_SERVER : " . print_r($_SERVER,true) ;
// Envoi du message
mail($email_admin, $message_titre, $message_corps) ;
// Ci-dessous, affichez votre page 404 sur mesure pour le visiteur.
?>
Eliminer les erreurs
Une fois le script mis en place, vous recevrez (le moins souvent possible, je l’espère) des avertissements sur des URL qui n’existent pas sur votre site. En général, il y a trois scénarios, et trois manières de les traiter :
- Cas 1 : le lien est obsolète ou mal orthographié sur une page de provenance unique. Si la page d’origine fait partie de votre site, il vous suffit de corriger le lien manuellement. Si elle est hébergée sur un site partenaire, le plus simple est de contacter le webmestre du site pour lui demander de mettre à jour ses liens.
- Cas 2 : le lien est obsolète ou mal orthographié sur un grand nombre de pages de provenance. Si les liens sont sur votre site, mais qu’il n’est pas possible d’automatiser le remplacement de tous les liens erronés, ou s’il est situé sur des sites externes nombreux ou inaccessibles, il faut trouver une autre solution. Ma préférence : la redirection permanente. Elle peut se faire au niveau du .htaccess ou en recréant un fichier PHP à l’url précédemment recherchée.
Exemple avec .htaccess
Redirect permanent /ancienne_url.html http://www.monsite.org/nouvelle_url
Exemple de script ancienne_url.php
<?php
header("Status: 301 Moved Permanently", false, 301);
header("Location: http://www.monsite.org/nouvelle_url");
exit();
?>
Exemple de fichier robots.txt
User-Agent: *
Disallow: /repertoire/ancienne_page.html
Conclusion
Cette méthode permet d’avoir en permanence un oeil sur les impasses de votre site. Elle ne pourra pas empêcher le drame avant qu’il survienne, mais si vous exercez un suivi scrupuleux, vous devriez minimiser le nombre d’erreurs 404 qui passent entre les filets. Il y a probablement des raffinements possibles, notamment quand le nombre d’alertes devient trop nombreux parce que des robots indexeurs des moteurs de recherche « inventent » des URL fictives à foison : un filtrage par navigateur (HTTP_USER_AGENT) fera généralement l’affaire.
Billets similaires
- Antispam pour les commentaires de blog : un Captcha sans images
- Recharger le cache CSS ou JS à chaque mise à jour des fichiers
- Des tableaux de données simples, standards et lisibles en CSS et PHP
- Tutoriel : créez une FAQ accessible et facile à mettre à jour avec JQuery
- Yahoo UI vs JQuery : quel framework Javascript pour vos applications Web 2.0 ?


Merci pour le lien et bravo pour l’article. Très intéressant.
Très bien comme article.
Je proposerais aussi, pour ceux qui sont vraiment pas doués en développement ou que ça n’iintéresse pas, d’utiliser Google webmaster tools (http://www.google.com/webmasters... ), qui liste les erreurs 404, même si aucun utilisateur n’arrive sur un lien mort (par exemple parce que le lien n’est jamais cliqué) mais que le robot crawl.
Bonjour,
Merci pour votre bout de code que je viens d’ajouter sur la page d’erreur de mon site.
Juste une petite remarque : dans le code indiqué, il y a un espace de trop dans $_SERVER['REQUEST _URI']
A bientot et bonne continuation!
Juste un petit souci sur l’hébergeur 1and1.
Le fichier .htaccess est quelques peu différents, par exemple, la partie intéressante sur le mien est :
<code>
RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /erreur.php
</code>
Cependant, je n’arrive pas à le faire marcher correctement, à savoir que les mails sont envoyés dans tous les cas, seulement dès que j’ai je renvoi sur une page totalement inexistante, toute la partie de dialogue avec ma base sql est impossible, tandis que sur une page du type index.php?page=page_inexistante, tout fonctionne correctement.
Si quelqu’un a la réponse…
PS : j’ai besoin du dialogue avec ma base sql car j’enregistre les informations dedans, au cas ou le mail ne fonctionnerais pas pour une raison ou pour une autre.
Merci d’avance et bonne continuation.
resoudre ce probleme afin d’ouvrir dette page et acceder au coolchat
Très sympa ce bout de code. Merci de l’avoir mis en ligne.
Bonjour,
J’utilise ce code 404 dans mon site et c’est génial ! Merci !
Par contre est-ce qu’il serait possible d’avoir un peu d’aide pour « iltrage par navigateur (HTTP_USER_AGENT) »… Je ne sais pas trop ou chercher ni comment faire…
Encore merci du script !
Sandra
Je lance le site http://page404.fr qui propose un annuaire pour mettre l’url de sa page 404 et recevoir les votes des internautes…je ne sais pas ce que ça va donner mais j’avais trouvé certaines pages d’erreur tellement sympa et travaillées que j’ai pensé qu’il pouvait être amusant de les répertorier.
Tres bon article. Je dirai egalement qu’il peut etre interessant de stocker les pages mortes dans une base de donnees plus que par mail. Cela permet de faire du post traitement des donnes + pour un gros sites ca peut faire bcp de mails
Bonjour
Je viens de faire ma page 404 http://www.id-grafik.com/404.php
@ID Grafik : joli, espérons que personne ne la verra jamais