Lorsque la requête HTTP du client Web est considérée comme
une erreur par Apache, ou lorsqu'un problème survient suite à
l'exécution de cette requête, Apache peut réagir de 4 façons
différentes :
- afficher le message d'erreur standard
- afficher un message d'erreur personnalisé
- rediriger l'utilisateur vers une URL locale afin de traîter le problème
ou l'erreur
- rediriger l'utilisateur vers une URL externe afin de traîter le problème
ou l'erreur
Le premier comportement est celui par défaut d'Apache. Les autres comportements
seront possibles au travers de la directive ErrorDocument.
La directive
ErrorDocument
Celle-ci peut être défini au niveau du fichier httpd.conf (serveur
principal, hôtes virtuels, répertoires), mais, et c'est cette possibilité
qui intéressera la plupart d'entre vous, dans un fichier .htaccess.
Sa syntaxe est : ErrorDocument Code_d'Erreur message|URL
Afficher un
message d'erreur personnalisé
Pour afficher un message d'erreur personnalisé, il suffit de le saisir
au niveau du paramètre message, précédé d'un guillemet
(symbole "). Ce guillement ne figurera pas dans le message affiché.
Apache ajoutera également d'autres informations explicitant l'errreur.
Exemple
ErrorDocument 404 "Erreur 404 : La page n'existe pas !
Rediriger
l'utilisateur vers une URL locale/externe
L'unique différence entre la redirection vers une URL locale ou externe
réside dans la façon dont l'URL est écrite. Faire commencer
l'URL par "/" indiquera une URL locale, alors que pour une URL externe,
on fera précéder le chemin vers le document ou le script par "http://"
et le nom du serveur.
Exemples
ErrorDocument 404 /404.html
ErrorDocument 404 /404.php
ErrorDocument 500 /cgi-bin/errorHandler.pl
ErrorDocument 401 http://geldenhu.free.fr/401.html
ErrorDocument 404 http://geldenhu.free.fr/404.php
ErrorDocument 403 http://geldenhu.free.fr/erreur.php
Attention toutefois que, lors de l'utilisation d'une directive ErrorDocument
désignant une URL externe (donc commençant par "http://"),
Apache émettra une requête de redirection au client (catégorie
3xx) pour lui indiquer l'emplacement du document.
Ceci peut avoir pour effet de perturber les robots ainsi que certains clients
particuliers qui vérifient la validité d'une URL en testant le
code de retour de la requête.
Ajoutons également qu'en raison de la nature des mécanismes de
l'authentification HTTP, l'utilisation de la directive ErrorDocument avec le
code 401 (Accès non autorisé), nécessite de ne pas utiliser
d'URL externe. Dans le cas contraire, suite au code de redirection émis,
le client ne se verra pas présenter la demande d'authentification et
les pages seront inaccessibles.
Note pour les utilisateurs d'Internet Explorer
Internet Explorer 5 et supérieur incluent des pages d'erreur standards
présentées à l'internaute si le site Web ne propose pas
de pages personnalisées OU si la taille de ces pages est inférieure
à une certaine taille en octets (256 ou 512 selon le cas).
Pour contourner ce "problème", vous pouvez soit compléter
la page d'erreur avec des commentaires HTML afin d'atteindre 512 octets, soit
opter pour l'une des deux modifications suivantes dans Internet Explorer :
• Dans les options d'Internet Explorer, onglet "Avancés",
décocher la case "Afficher des messages d'erreur HTTP simplifiés",
• Dans la base de registre, rechercher le dossier HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet
Explorer\Main\ErrorThresholds. Vous trouverez alors plusieurs entrées
correspondant à un code HTTP et la taille de page minimum attendue pour
afficher la page du site plutôt que la page interne d'IE.
Référence : Description
des messages d'erreur HTTP, Microsoft.
Plus
loin dans la personnalisation...
Comme nous venons de l'évoquer, l'URL peut désigner aussi bien
une page statique qu'un script "côté serveur" écrit
avec PHP ou encore un CGI écrit en Perl. Cependant, cette possibilité
sera d'autant plus intéressante que certaines informations concernant
l'environnement et les raisons précises de l'erreur seront disponibles,
dans le but de délivrer le message le plus clair possible.
Nous en avons rêvé, Apache l'a fait. Ainsi, les variables d'environnement
CGI suivantes seront disponibles :
- REDIRECT_HTTP_ACCEPT (type MIME acceptés par le client)
- REDIRECT_HTTP_USER_AGENT (description du navigateur client)
- REDIRECT_PATH (chemin de recherche des binaires sur le serveur)
- REDIRECT_REMOTE_ADDR (adresse IP du client)
- REDIRECT_REMOTE_HOST (nom qualifié du client si disponible)
- REDIRECT_SERVER_NAME (nom qualifié ou adresse IP du serveur)
- REDIRECT_SERVER_PORT (port TCP/IP utilisé par le serveur pour "écouter"
les requêtes)
- REDIRECT_SERVER_SOFTWARE (description du serveur HTTP utilisé)
- REDIRECT_URL (URL ayant conduit à l'URL actuelle)
- REDIRECT_QUERY_STRING (paramètres de formulaire passés via
l'URL)
- REDIRECT_STATUS (code HTTP du statut)
Plusieurs éléments clés sont à prendre en compte
:
- toutes les variables sont préfixées par la chaîne "REDIRECT_",
- ces variables n'existeront que si elles existaient sous leur forme non préfixée
préalablement au traitement de l'erreur,
- les variables REDIRECT_URL et REDIRECT_STATUS seront quant à elles
toujours renseignées ; REDIRECT_QUERY_STRING sera vide à moins
que des paramètres soient passés au script/CGI via l'URL de
redirection,
- aucune des deux variables précédemment citées ne sera
initialisée si le document d'erreur est le résultat d'une redirection
externe, c'est-à-dire débutant par "http://". Ceci
est valable même si le site cible est le même que le site d'origine
de la redirection.
Nous allons maintenant étudier comment utiliser au mieux la directive
ErrorDocument et cet environnement CGI au travers de PHP.