www.menfin.net
français
GEEK ZONE
Calendrier26 octobre 2007
Commentaires 1 Commentaire
99 pièces et pas une de plus précédent suivant De jolies couleurs

Gestion des erreurs HTTP

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

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. (afficher)
Réagissez maintenant à cet article (afficher)
Crédits
Adoptez Firefox Profile :: Coolphotoblogs.org Votez ! Valid XHTML 1.0 Strict Valid CSS! 8 Personnes suivant le site Site sans Pub © BobCaTT — 2003 - 2008