Dans un site de grande taille, avec des mouvements et renomages de fichiers, il devient difficille de gérer les erreurs 404 (fichier non trouvé). Fautes d'ortographe et oublis de mises à jours, il est parfois compliqué d'éviter complêtement ce problème. Evidement on peut traquer ce type d'erreurs dans le fichier de log, notament avec un logciel dédié mais la méthode présentée ici permet d'accélérer le traitement de ce erreurs.
Notre solution est une combinaison de fichier .htaccess et un petit programme en perl.
Sur les serveurs Apache, les fichiers .htaccess permettent d'ajouter des directives de configuration sans avoir à redémarer le serveur. Ils sont notament utilisés pour restreindre l'accés à des parties privées.
Ici nous allons juste utiliser une directive, celle qui permet de personaliser les messages qui apparaissent en cas d'erreur:
ErrorDocument 404 /cgi-bin/e404.cgi
Au lieu de renvoyer à un document statique en cas d'erreur 404, on éxécute à la place un script en perl.
Le script en perl va envoyer un message au webmaster lui indiquant dans quel contexte l'erreur 404 s'est produite. Pour ce faire, on commence par recupérer deux variables d'environnement, HTTP_REFERER c'est à dire l'adresse du document qui a un lien vers le document manquant et REQUEST_URI qui contient lui l'adresse de ce document.
#!/usr/bin/perl
# All by HAbeTT
# Fucking off the 404
$refer = $ENV{'HTTP_REFERER'};
$locat = $ENV{'REQUEST_URI'};
On utilise ensuite sendmail pour faire parvenir au webmaster le rapport d'erreur 404.
open(SENDMAIL, "|/usr/lib/sendmail -t") or die "Can't fork for sendmail: $!\n"; print SENDMAIL <<EOM; From: e404\@habett.org To: webmaster\@habett.org Subject: Erreur 404 Une erreur est apparue sur notre site. Le lien suivant est éroné: $refer vers $locat Merci de corriger au plus vite. EOM close(SENDMAIL) or warn "Sendmail didn't close nicely";
Reste maintenant à rediriger vers une page de sortie sur laquelle on indiquera qu'il y a bien une erreur de type 404 et que le webmaster en a été prévenu.
print "Location: e404.html\n\n"; exit (0);
Sur notre site, nous adoptons une approche un peu différente dans la mesure où nous faisons en sorte que le rapport d'erreur se fasse en deux temps. La première phase constate l'erreur et construit un formulaire caché avec les informations sur l'erreur (référant et cible) que l'on demande au visiteur de valider pour déclancher la signification de l'erreur au webmaster. Cette approche permet d'être plus sélectif dans la gestion des documents.
Une évolution pourait être de procéder à une distinction entre les appels à un document inexistant depuis l'intérieur et l'extérieur du site.