Des pages d'erreur personnalisées avec Apache

À propos...

Auteur : giminik (Matthieu PETIOT)

Date : 14/07/2006

Que l'on possède un serveur Web ou qu'on le loue chez un hébergeur, on peut parfois regretter la monotonie des pages d'erreurs que génère Apache. Cet article vous guidera dans la mise en place de pages d'erreurs personnalisées. Quelques conditions sont nécessaires tout de même : votre serveur Web doit être configuré pour interpréter les fichiers .htaccess. Si vous avez accès à la configuration du serveur, il n'y a pas de problème, sinon contactez votre hébergeur pour le savoir. Vous devez également être en mesure de créer des pages html, mais ce n'est pas très difficile.

Les codes d'erreurs du protocole HTTP

Avant d'entrer dans le vif du sujet, nous allons voir quels sont les codes d'erreurs existants dans le protocole HTTP 1.1 qui est définit par la RFC 2616.

Codes d'état du protocole HTTP 1.1.
Code Intitulé
400 Bad Request La syntaxe de la requête est incorrecte
401 Unauthorized L'accès à la ressource n'est pas autorisé car le serveur exige une identification de l'utilisateur
402 Payment Required Un paiement est requis pour accéder à la ressource (réservé pour une utilisation future)
403 Forbidden Le serveur refuse de délivrer la ressource
404 Not Found La ressource spécifiée n'existe pas
405 Method Not Allowed Le client tente d'utiliser une méthode non autorisée sur la ressource spécifiée
406 Not Acceptable La réponse ne correspond pas aux caractéristiques de la directive Accept de la requête
407 Proxy Authentification Required Le serveur proxy exige une identification avant de transmettre la requête
408 Request Timeout Le temps d'attente de la réponse du client est écoulé
409 Conflict La requête entre en conflit avec l'état actuel de la ressource
410 Gone La ressource n'est plus disponible et aucune adresse de remplacement n'est connue
411 Length Required La longueur de la requête n'a pas été précisée
412 Precondition Failed Une des conditions envoyées dans la requête n'est pas vérifiée
413 Request Entity Too Large La ressource demandée est trop volumineuse pour le serveur
414 Request-URI Too Long L'URI de la ressource spécifiée est trop longue
415 Unsupported Media Type Le format de requête n'est pas supporté par la ressource demandée
416 Requested Range Not Satisfiable Le client demande un Range impossible à déterminer sur la ressource
417 Expectation Failed La prévision de ressource exprimée dans le champ Expect de la requête ne peut pas être satisfaite
500 Internal Server Error Une erreur interne au serveur est survenue
501 Not Implemented La fonctionnalité réclamée n'est pas supportée par le serveur
502 Bad Gateway Le serveur ne comprend pas la requête qui provient d'un proxy ou d'une passerelle
503 Service Unavailable Le service n'est pas disponible pour le moment
504 Gateway Timeout La temps d'attente provenant d'un proxy est écoulé
505 HTTP Version Not Supported La version du protocole HTTP spécifiée par le client n'est pas supportée par le serveur

Les codes d'erreurs commençant par le chiffre 4 sont des erreurs côté client tandis que ceux qui commencent par le chiffre 5 sont des erreurs internes au serveur Web. Ces dernières sont bien évidemment très rares puisque Apache est très fiable.

Mise en place de la page d'erreur

La page d'erreur la plus connue est la dénommée erreur 404 qui s'affiche lorsqu'une adresse pointe sur un document qui n'existe pas. L'erreur 403 est également très connue, vous la voyez après avoir tenté de voir le contenu d'un répertoire qui n'est pas configuré pour afficher son contenu. Pour réaliser cela, nous allons utiliser la directive ErrorDocument. Cette directive peut être utilisée dans le fichier de configuration d'Apache, dans un <VirualHost>, dans un <Directory> ou dans le fichier .htaccess. En fonction de la configuration de votre serveur Web, il se peut que votre fichier .htaccess soit nommé différemment, veuillez vérifier au sein de votre configuration : regardez la valeur affectée à la directive AccessFileName. De plus, pour que ces fichiers soient interprétés, la directive AllowOverride doit être correctement configurée.

Message d'erreur personnalisé

Une page d'erreur personnalisée simple consiste à afficher un message textuel sans mise en forme. Cela se fait en utilisant la directive ErrorDocument suivie du numéro de l'erreur puis du message précédé d'un guillemet double. Le guillemet de fermeture n'est pas interprété comme un délimiteur de chaîne avec Apache 1.3, par contre, il l'est avec Apache 2.0.

# avec Apache 1.3
ErrorDocument 404 "Le document que vous tentez de voir n'existe pas...
# avec Apache 2.0
ErrorDocument 404 "Le document que vous tentez de voir n'existe pas..."

Si vous regardez le contenu du répertoire erreur01/, vous constaterez que rien ne s'y trouve, pas même le fichier .htaccess contenant le code ci-dessus. Si vous tentez de voir la page erreur01/test.html qui est inexistante, vous verrez alors le message d'erreur. Les effets du fichier .htaccess s'appliquent également à tous les sous-dossiers à moins que vous ne redéfinissiez un fichier .htaccess dans l'un de ces sous-répertoires. Le répertoire erreur02/ contient exactement le même fichier .htaccess que celui du dossier erreur01. Dans le sous-répertoire erreur02-1, j'ai ajouté le fichier .htaccess contenant les lignes suivantes :

Options -Indexes
ErrorDocument 403 "Vous n'avez pas l'autorisation de voir le contenu...

Il s'agit de la définition d'une erreur 403, et pour qu'il soit possible de visualiser son effet, j'ai désactivé l'affichage du contenu du répertoire. Vous pouvez voir son effet en tentant d'afficher le contenu du répertoire erreur02/erreur02-1/. L'erreur 404 définie dans le répertoire parent affecte également celui-ci. Si vous tentez de voir le fichier inexistant erreur02/erreur02-1/test.html, vous obtiendrez la même erreur 404. Avec Apache 2.0, il est possible de revenir aux anciennes pages d'erreurs en utilisant la valeur default comme ceci ErreurDocument 404 default.

Page d'erreur personnalisée

Vous devez sans doute vous dire que ces messages sont peu attrayants. Je partage cet avis. Heureusement, la directive ErrorDocument peut admettre comme argument l'adresse d'une page HTML, PHP ou encore d'un script CGI... L'adresse de la page peut être une adresse interne ou externe (pointant vers un autre nom de domaine). Lors de l'utilisation d'une adresse locale, il est fortement conseillé de ne pas utiliser de liens relatifs et il n'est pas nécessaire d'indiquer le nom de domaine. Généralement, il est prudent de désigner un document local en le désignant depuis la racine, c'est-à-dire en commençant par le symbole "/".

Ici, nous définissons un fichier .htaccess avec deux fichiers HTML représentant les erreurs 403 et 404. Ces deux fichiers doivent, bien entendu exister. Pour conserver une hiérarchie cohérente des fichiers du site, je les ai placés dans des sous-répertoires de cet article, mais il est tout à fait possible de les mettre n'importe où sur le site. Voyez le dossier erreur03/ et la page inexistante erreur03/test.html.

Options -Indexes
ErrorDocument 403 /articles/apache/page-erreur-personnalisee/erreur03/fichiers-erreur/erreur403.html
ErrorDocument 404 /articles/apache/page-erreur-personnalisee/erreur03/fichiers-erreur/erreur404.html

Ici, vous voyez qu'il est possible de passer des paramètres à la page d'erreur via la méthode GET. Il suffit de tester la valeur du paramètre pour afficher le message correspondant à l'erreur. De plus, il est possible de mettre en place un traitement permettant de savoir quelle est la page qui a fait l'objet d'une erreur, de stocker l'adresse IP du visiteur dans le cas d'une tentative de piratage, et peut-être bien d'autres choses. Voyez le dossier erreur04/ et la page inexistante erreur04/test.html.

Options -Indexes
ErrorDocument 403 /articles/apache/page-erreur-personnalisee/erreur04/fichiers-erreur/erreur.php?num_erreur=403
ErrorDocument 404 /articles/apache/page-erreur-personnalisee/erreur04/fichiers-erreur/erreur.php?num_erreur=404

Et voici le code de la page erreur.php utilisée dans l'exemple :

<?php
if ($_GET['num_erreur'] == "403") {
    echo "Erreur 403...";
    // traitement...
}
elseif ($_GET['num_erreur'] == "404") {
    echo "Erreur 404...";
    // traitement...
}
?>

Vous pouvez mettre ce que vous voulez dans vos pages d'erreur. Évitez d'y mettre des redirections. Vous pouvez y mettre un formulaire de recherche pour votre site, c'est une bonne idée. Il est possible de faire tout un tas de choses, à vous de faire jouer votre imagination.

Pour toute question, correction, supplément d'informations, envoyez moi un message privé.