Accueil | Recherche | News | Articles | Téléchargement | Forums | Commentaires | A propos
       
 
Hébergement mutualisé chez OVH

  Recherche
  Catégories

• Apache
• PHP
• Système
• Tomcat

  Webmestres

   Page de démarrage
    Ajouter aux favoris
    Les news sur
    votre site

  Dernières versions

Apache 2.2.8
Apache 2.0.63
Apache 1.3.41
PHP 4.4.7
PHP 5.2.4
MySQL 5.0.45
MySQL 4.1.22
MySQL 4.0.27
phpMyAdmin 2.11.0
Tomcat 5.5.20
Tomcat 4.1.34
Tomcat 3.3.2

  Derniers modules

mod_auth_bsd 1.2
mod_design 0.4
mod_ometer 1.2.0
mod_epp 1.0
mod_mono 0.3.6

  Statistiques

Apache
PHP  

  Documentation

Apache 1.3
Apache 1.3 VF
Apache 2.0
Tomcat 3
Tomcat 4
PHP
MySQL

  Liens

Apache
Apache Project
Jakarta Project
Liste des bugs
Apache Today
Apache Week
Apache Reference
Apache@Slashdot
Reference cards

PHP/MySQL
PHP
MySQL
PHP Index
PHP Team

Accès direct
Imprimer cet article
Version imprimable

Des pages d'erreur personnalisées avec Apache et PHP
23 juin 2002

Intégration avec PHP

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&eacute;sent&eacute;e suite au clic sur un lien ou un tout
  autre &eacute;l&eacute;ment devant conduire &agrave; une page existante, n'h&eacute;sitez
  pas &agrave; nous en faire part en cliquant <a href="/Contact/">ici</a>, nous
  ferons rapidement le n&eacute;cessaire.<br>
  <br>
  Nous vous remercions pour votre compr&eacute;hension.<br>
  <br>
  Cliquer <a href="/">ici</a> pour retourner &agrave; 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).



Copyright © 2001-2004 M.Geldenhuys - Tous droits réservés