Accueil Boite à Outils Scripts PHP Page Erreur 404 en PHP

Publié le : 18 août 2004
Imprimer Imprimer cet article

Auteur :
Alain Sichel

Alain Sichel
Page Erreur 404 en PHP

Cet article présente un exemple de page Erreur 404 en PHP [1]. On appelle Erreur 404 le fait que le serveur n’ait pas trouvé de page à l’adresse demandée. Plutôt que de se contenter du message "Not Found" du serveur, on réalise une page personnalisée pour le site.

Pourquoi faire une page Erreur 404 personnalisée ?

- Un visiteur qui voit le message type Erreur 404 du serveur est un visiteur de perdu, alors qu’avec une page personnalisée, on lui montre qu’on est soucieux de corriger le lien défectueux (ou on lui indique l’origine du problème) et on lui donne les informations pour s’orienter dans le site (par exemple afficher le plan du site).

- Pour le webmestre un signalement d’un lien défectueux permet une correction rapide.

Quel type de page Erreur 404 personnalisée ?

- Tout dépend de ce que l’on souhaite : si on veut simplement indiquer au visiteur le plan du site [2], il n’est pas nécessaire de faire une page dynamique en PHP.

- Cet article est pour ceux qui veulent aller plus loin et qui souhaitent des informations sur les erreurs d’accès à leurs pages. Le script proposé ici n’est pas parfait, mais il fait la synthèse de tout ce que j’ai pu trouver et essayer sur ce sujet [3], notamment après avoir abandonné l’envoi systématique d’un mail au Maître-Toile qui donnent de nombreux messages inutilisables (faux positifs qui ne sont pas en fait de vraies erreurs 404).

Le fichier .htaccess

Si vous utilisez un serveur Apache (situation la plus fréquente), il faut mettre un fichier .htaccess à la racine du site. Ce fichier doit indiquer le lien vers la page d’erreur personnalisée, par exemple [4] :

ErrorDocument 404 /erreur_404.php

Notez que pour le bon fonctionnement, il vaut mieux ne pas utiliser de lien absolu, contrairement à ce qu’on peut trouver dans certains guides ; on préférera donc ErrorDocument 404 /erreur_404.php à ErrorDocument 404 http://www.mondomaine.com/erreur_404.php

En cas de difficulté, l’écriture et l’installation de ce fichier sont bien expliquées dans d’autres pages [5], cet article va donc se consacrer plutôt au script dans la page d’erreur 404.

La page Erreur 404

Le script décrit ici est utilisé sur le site cyes.info. Avec ce script, l’envoi d’un message au Maître-Toile n’est pas automatique, mais commandé par le visiteur. Ce script peut être testé ici : Erreur 404 et l’ensemble du code peut être copié en bas de cette page [6]. Voici le détail de ce code :

<?php
if (!empty($_POST)) {
$to="webmestre@domaine.com";
$sujet="Signalement d'une erreur 404";
$vmessage=($_POST["message"]);
@mail($to,$sujet,$vmessage,"From : Erreur_404");
$history=2;
echo "<p><b>Le problème a bien été signalé au webmestre du site. Nous vous remercions.</b></p><br />\n";
}

- Par commodité d’écriture le script commence par la deuxième étape, car si $_POST [7] n’est pas vide, c’est que le visiteur a demandé l’envoi du message au Maître-Toile. On récupère ce message que l’on envoie avec la fonction mail(), et on signale que le message a bien été envoyé. La suite de la page, après le script comprend les boutons (vers la page d’accueil et retour page précédente) et le plan du site :

<form name="boutons">
<table width="95%" border="0" cellspacing="0" cellpadding="0" align="center">
             <tr>
               <td><center><input type="button" name="accueil" value="Retour à la page d'accueil" onclick="location.href='http://www.domaine.com/'" /></center></td>
               <td> <center><input type="button" name="precedent" value="Retour page précédente"  onclick="history.go(-<? echo $history ?>)" /></center></td>
             </tr>
</table></form>

- Il n’est pas souhaitable de permettre le retour à la page précédente (qui est le premier affichage de la page Erreur 404 proposant l’envoi du message au webmestre), on va donc plutôt demander l’affichage de la page d’avant en donnant à $history la valeur 2.

else {
$history=1;
$result=1;
if (!empty($SCRIPT_URI)) { echo "<p>La page <span class='red'>".$SCRIPT_URI."</span> que vous avez demandée n'existe pas...</p>\n"; }
if (preg_match("'DigExt'",$HTTP_USER_AGENT)) $result=3;
if (preg_match("'votre_application_JAVA'",$SCRIPT_URI)) $result=4;
if (preg_match("'cltreq.asp'",$SCRIPT_URI)) $result=2;
if (preg_match("'owssvr.dll'",$SCRIPT_URI)) $result=2;
if (empty($HTTP_REFERER) || ($HTTP_REFERER=="http://www.domaine.com".$PHP_SELF) || empty($SCRIPT_URI)) $result=0;

- Retour à la suite du script : si $_POST est vide (c’est le cas au premier affichage de la page), on affiche le bouton de retour vers la page précédente ($history prend la valeur 1). On initialise la variable $result à 1 et on cherche à reconnaître les "fausses erreurs 404" pour lesquelles on donne une autre valeur à $result, ce qui permettra d’afficher une réponse adaptée.

if ($result==0) {
echo "<p>Si vous pensez qu'il s'agit d'une erreur dans le site, vous pouvez signaler le problème au <a href=\"/aide/contact_webmestre.php\">webmestre</a>.</p>\n";
}

- Si $result a la valeur 0, c’est que $SCRIPT_URI est vide. Peut-être s’agit-il quand même d’une erreur 404, alors on présente un lien vers la page contact pour permettre au visiteur de signaler le problème.

if ($result==1) {
$erreur ="DATE : ".date("d/m/Y H:i")."\n\nERREUR :\n";
$erreur.="- HTTP_REFERER : ".$HTTP_REFERER."\n- SCRIPT_URI: ".$SCRIPT_URI."\n";
$visiteur ="\nVISITEUR :\n- Navigateur : ".$HTTP_USER_AGENT."\n- Adresse IP : ".$REMOTE_ADDR."\n";
$visiteur.='- Nom de domaine : '.gethostbyaddr($REMOTE_ADDR)."\n\nCOMMENTAIRE :\n";
$message= $erreur.$visiteur;
echo "<p>Si vous pensez qu'il s'agit d'une erreur dans le site, vous pouvez le signaler au webmestre avec si nécessaire, votre commentaire pour expliquer le problème&nbsp;:</p>\n";
echo "<form name='rapport' action='".$PHP_SELF."' method='post'><center>\n";
echo "<input type='hidden' name='message' value='$message' />Page d'origine : ".$HTTP_REFERER."<textarea name='commentaire' rows='4' cols='70'></textarea><br />\n";
echo "<br /><input type='submit' value=\"Cliquez ici pour signaler l'erreur\" /></center>\n";
echo "</form>\n";
}

- Si $result vaut 1, on propose au visiteur de signaler le problème au Maître-Toile, avec la possibilité d’ajouter une phrase de commentaire (C’est une option, on peut facilement supprimer du script cette possibilité de commentaire). Les données récupérées (la page demandée, les informations sur le visiteur) seront envoyées avec le message).

if ($result==2) {
echo "<p>L'analyse de l'erreur montre qu'elle est provoquée par l'utilisation du module <b>&quot;Discuter&quot;</b> de votre navigateur.</p>\n";
}
if ($result==3) {
echo "<p>L'analyse de l'erreur montre qu'elle est provoquée par l'utilisation de <b>&quot;DigExt&quot;</b>, un module Internet Explorer servant à consulter une page hors ligne.</p>\n";
}
if ($result==4) {
echo "<p>L'analyse de l'erreur montre qu'elle est provoquée par votre navigateur, qui est mal configuré pour lire le <b>JavaScript</b> ou le <b>JAVA</b>.</p>\n";
}
}
?>

- Si $result vaut 2, 3 ou 4, on indique au visiteur l’origine du problème. Voilà pour le script proprement dit et la réponse adaptée à chaque situation. La suite de la page, après le script, permet à l’internaute de se retrouver dans le site : boutons vers la page d’accueil, retour page précédente et plan du site. Il y a bien 2 accolades de fermeture à la fin du code, il ne faut pas oublier qu’on en avait ouvert une, plus haut dans le script, après else.


 

[1] Cette page a été mise au point pour le site www.cyes.info, la page choix techniques présente aux webmestres les différentes techniques mises en œuvre pour ce site. Pour qu’une page de ce type fonctionne, elle doit avoir une extension .php ou .php3 et être placée sur un serveur interprétant le PHP. Cet article a été modifié le 20/11/04 pour améliorer le script.

[2] Voir par exemple la page Erreur 404 d’Atoute.

[3] Notamment Info d’une erreur 404, Pourquoi personnaliser ses pages d’erreur ? et Erreur 404 personnalisée.

[4] Dans cet exemple, la page est nommée "erreur_404.php" et est placée à la racine du site.

[5] Voir Quelques outils du webmaster (sur SNOF), Le fichier .htaccess (sur SPIP-Contrib), Apache - Les fichiers .htaccess (sur Comment Çà Marche) et Le fichier .htaccess (sur Webmaster HUB).

[6] Le code du script :


[7] Avant la version 4.12 de PHP, il faut utiliser $HTTP_POST_VARS à la place de $_POST




Cliquez ici pour réagir à cet article

Imprimer Imprimer cet article


Réactions à l'article :