Cette dernière partie décrit une façon de récupérer
les principales erreurs et de proposer un affichage personnalisé en s'appuyant
sur PHP. Le mécanisme décrit est celui employé sur Apache
France.
Paramétrage
d'Apache
L'hypothèse de départ est que nous souhaitons disposer des pages
d'erreur personnalisées sur l'ensemble du site pour les erreurs les plus
communes :
- 401 : Authentification nécessaire
- 403 : Accès interdit
- 404 : La page spécifiée n'existe pas
- 500 : Erreur interne du serveur
Nous souhaitons également traiter les erreurs dans un script unique,
écrit en PHP, que nous appelerons erreur.php.
ErrorDocument 401 /erreur.php
ErrorDocument 403 /erreur.php
ErrorDocument 404 /erreur.php
ErrorDocument 500 /erreur.php
Comme indiqué précédemment lors de la présentation
de la directive, les lignes de configuration seront ajoutées soit dans
le fichier httpd.conf dans la section du site principal, soit dans le fichier
httpd.conf dans la section des hôtes virtuels, pour un site particulier,
soit dans un fichier .htaccess qui sera placé à la racine de l'arborescence.
Pour protéger l'accès malencontreux à certaines fichiers
(et tester la personnalisation de l'erreur 403), nous allons également
désactiver le listing de répertoires via la directive Option et
le paramètre -Indexes.
Options -Indexes
Cette directive est à utiliser soit au niveau d'un bloc "Directory"
correspondant à la racine de votre arborescence (httpd.conf), soit directement
(fichier.htaccess).
Voici par exemple le fichier .htaccess utilisé sur Apache France :
ErrorDocument 401 /erreur.php
ErrorDocument 403 /erreur.php
ErrorDocument 404 /erreur.php
ErrorDocument 500 /erreur.php
Options -Indexes
Certains hébergeurs limitent ou désactivent l'utilisation des
fichiers .htaccess. Ainsi, Free.fr autorise un fichier .htaccess avec les directives
ErrorDocument, mais les redirections ne sont autorisées que vers des
pages statiques.
Présentation
du script Erreur.php
Le script Erreur.php est chargé de l'affichage d'un message d'erreur
explicit en fonction de l'erreur commise par l'internaute ou du problème
rencontré par le serveur.
Vu qu'il n'y a qu'un seul script pour toutes les erreurs, il faudra donc récupérer
les variables CGI nécessaires. Nous n'avons besoin que de REDIRECT_STATUS,
qui nous permettra de déterminer le code d'erreur. L'autre variable utile,
REQUEST_URI (il s'agit bien d'un i majuscule), est propre à PHP et contient
l'URL demandée par l'internaute. Par exemple, si ce dernier a demandé
la page http://www.monsite.com/toto/titi.html, REQUEST_URI contient "/toto/titi.html".
Nous avons également choisi d'utiliser les
super variables globales introduites avec PHP 4.1. Dans ce cas, REQUEST_URI
et REDIRECT_STATUS sont disponibles via le tableau associatif $_SERVER. Si vous
disposez d'une version antérieure ou que les super variables globales
sont désactivées, il suffit de profiter du mécanisme d'instanciation
automatique des variables CGI sous forme de variables locales : $REQUEST_URI
et $REDIRECT_STATUS.
Nous allons maitenant étudier le script Erreur.php.
Etude du script
Erreur.php
Tout d'abord, afin de protéger le script, nous testons l'existence de
la variable REDIRECT_STATUS.
if (!isset($_SERVER["REDIRECT_STATUS"])) Header("Location:
/");
Si elle existe, nous sommes redirigés vers le script suite à
une erreur Apache : tout va bien, l'exécution du script continue. Dans
le cas contraire, un internaute fait un appel direct au script : nous effectuons
une redirection vers la racine du site via la fonction PHP header().
Après avoir "requis" certains librairies/fichiers, nous allons
décrire un tableau associatif associant un message spécifique
à un code d'erreur.
$source_erreur = $_SERVER["REQUEST_URI"];
$code_erreur = $_SERVER["REDIRECT_STATUS"];
$cause_erreur['401'] = "Authentification
nécessaire";
$cause_erreur['403'] = "Accès
interdit";
$cause_erreur['404'] = "La
page spécifiée n'existe pas";
$cause_erreur['500'] = "Erreur
interne du serveur";
$libelle_erreur = "Erreur $code_erreur";
Pour plus de facilité, nous récupérons l'URL demandée
et le code d'erreur respectivement dans les variables $source_erreur et $code_erreur.
Le tableau associatif $cause_erreur permettra de faire le lien.
Après l'affichage de l'en-tête ( showHeader() ), nous écrivons
le corps de la page qui sera personnalisé par l'affichage de l'URL à
la source de l'erreur, du code d'erreur, et du message d'erreur correspondant.
echo "$source_erreur : $libelle_erreur : $cause_erreur[$code_erreur]";
Enfin, nous affichons le pied de page ( showFooter() ).
Voici le script Erreur.php complet :
<?
if (!isset($_SERVER["REDIRECT_STATUS"])) Header("Location:
/");
require_once('articles.inc.php');
$source_erreur = $_SERVER["REQUEST_URI"];
$code_erreur = $_SERVER["REDIRECT_STATUS"];
$cause_erreur['401'] = "Authentification
nécessaire";
$cause_erreur['403'] = "Accès
interdit";
$cause_erreur['404'] = "La
page spécifiée n'existe pas";
$cause_erreur['500'] = "Erreur
interne du serveur";
$libelle_erreur = "Erreur $code_erreur";
showHeader($libelle_erreur,0);
?>
<p><span class=grosTitre><?php echo "$source_erreur : $libelle_erreur : $cause_erreur[$code_erreur]"; ?></span></p>
<p>Si cette page est présentée suite au clic sur
un lien ou un tout
autre élément devant conduire à
une page existante, n'hésitez
pas à nous en faire part en cliquant <a href="/Contact/">ici</a>,
nous
ferons rapidement le nécessaire.<br>
<br>
Nous vous remercions pour votre compréhension.<br>
<br>
Cliquer <a href="/">ici</a> pour retourner à
l'accueil.</p>
<?
showFooter(0);
?>
Vous pouvez avoir un aperçu des pages générées
ici (erreur
403) ou bien ici
(erreur 404).