Des pages d'erreur personnalisées avec Apache
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.
| 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é.