Gestion des erreurs HTTP

26 octobre 2007 // 1 commentaire // Technos Web  // précédent  // suivant

La nuit, quand je n’arrive pas à dormir, il m’arriver de me relever et de g33ker un bon coup. A défaut de me reposer, cela a au moins le mérite de me détendre un peu.

Il y a peu, j’analysais mes statistiques de fréquentation. De jolis graphiques généré chaque jour par awstats. Et puis, en y regardant de plus près, j’ai constaté que j’avais pas mal de pages qui renvoyaient un code HTTP 403 (Liste des codes HTTP). Malheureusement, je n’ai pas trouvé dans awstats une solution pour me dire les pages concernées par ce problème, ni la raison d’ailleurs.

Bon, j’avais déjà une idée de mon problème... J’interdis le téléchargement des images, si celles-ci ne sont pas affichées par mon site (prévention contre les « hotlink » mais d’après les stats, le nombre est plutôt élevé. Alors, je me suis dis que j’allais coder un peu pour découvrir le pourquoi du comment.

Le but du script ci-dessous est d’enregistrer les requêtes HTTP en erreur, d’enregistrer les informations utiles dans un fichier journal, triés en fonction du code d’erreur. Puis, ces opérations effectuées, de rediriger l’internaute vers une page d’erreur plus explicite qu’un vulgaire code.

  1. <?php
  2. function call_redirect($url)
  3. {
  4.   header("Location: $url");
  5.   exit();
  6. }
  7.   define(URL_REDIRECT,"/spip.php?page=404");
  8.   // pas de code HTTP transmis par apache
  9.   if ( array_key_exists('REDIRECT_STATUS',$_SERVER) != TRUE ) call_redirect(URL_REDIRECT);
  10.   // test sur des problèmes de open_basedir
  11.   $log_dir = $_SERVER["DOCUMENT_ROOT"]."/tmp/";
  12.   if ( ! @realpath($log_dir) ) call_redirect(URL_REDIRECT);
  13.   define(APP_LOG_DIR,@realpath($_SERVER["DOCUMENT_ROOT"]."/tmp") );
  14.   // creation du repertoire de logs
  15.   if ( @file_exists(APP_LOG_DIR) != TRUE )
  16.   {    
  17.     // si echec alors redirection
  18.     if ( @mkdir(APP_LOG_DIR) != TRUE )
  19.     {          
  20.       call_redirect(URL_REDIRECT);
  21.       return;          
  22.     }          
  23.   }    
  24.   // creation des variables
  25.   $date = date("d/M/o:H:i:s O");
  26.   $dom = date("d");
  27.   $ip = $_SERVER["REMOTE_ADDR"];
  28.   $status = $_SERVER["REDIRECT_STATUS"] ? $_SERVER["REDIRECT_STATUS"] : '-';
  29.   $referrer = $_SERVER["HTTP_REFERER"] ? $_SERVER["HTTP_REFERER"] : '-';
  30.   $agent = $_SERVER["HTTP_USER_AGENT"] ? $_SERVER["HTTP_USER_AGENT"] : '-';
  31.   $uri = $_SERVER["SCRIPT_URI"];
  32.   $log_file = APP_LOG_DIR.'/error.'.$status.'.'.$dom.'.log';
  33.   $log = $ip.' ['.$date.'] '. $status.' '.$uri.' '.$referrer.' '.$agent."\n";
  34.   $fd = @fopen($log_file,'a+');
  35.   if ( $fd == FALSE ) call_redirect(URL_REDIRECT);
  36.   @fwrite($fd,$log);
  37.   @fclose($fd);
  38.   call_redirect(URL_REDIRECT);
  39. ?>

Ce script s’interface avec Apache via la directive ErrorDocument (la doc est ici)

Cela donne au final dans mon cas pour ma configuration apache :

ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 405 /error.php

1 commentaire de mouche. [+]