Gestion des erreurs 404 sous Apache avec perl

Principe

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.

Mise en oeuvre

Notre solution est une combinaison de fichier .htaccess et un petit programme en perl.

.htaccess

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.

Script perl e404.cgi

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);

Variantes

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.

menu principal