1
106

Renvoyer une erreur HTTP

Créez site9 en copiant site8.

  1. /cms
    1. ...
    2. site8
    3. site9

Dans ce chapitre, nous allons programmer les réponses d'erreurs HTTP.

Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site9 dans la barre d'adresse de votre navigateur. Essayez une URL invalide en français et une autre en anglais pour afficher les pages d'erreurs Non trouvé et Not Found.

Créez le dossier error dans le dossier actions puis le fichier notfound.php dans le dossier actions/error avec le contenu suivant :

  1. /cms/site9
    1. actions
      1. error
        1. notfound.php
  1. function notfound($lang) {
  2.     head('title', translate('http_not_found:title', $lang));
  3.     head('robots', 'noindex, nofollow');
  4.  
  5.     $contact=true;
  6.     $banner = build('banner', $lang, compact('contact'));
  7.  
  8.     $contact_page=url('contact', $lang);
  9.     $content = view('error/notfound', $lang, compact('contact_page'));
  10.  
  11.     $output = layout('standard', compact('banner', 'content'));
  12.  
  13.     header('HTTP/1.1 404 Not Found');
  14.  
  15.     return $output;
  16. }

L'action notfound retourne une erreur HTTP/1.1 404 Not Found suivie d'un document qui affiche un message d'erreur avec un lien sur la page de contact.

Ajoutez le titre de la page dans le fichier includes/strings.inc.

En français dans le tableau 'fr' :

  1.         'http_not_found:title'              => 'Non trouvé',

En anglais dans le tableau 'en' :

  1.         'http_not_found:title'              => 'Not Found',

Créez un dossier error dans les dossiers views/fr et views/en. Ajoutez la vue de la page d'erreur dans les dossiers views/fr/error pour la version en français et views/en/error pour la version en anglais.

  1. /cms/site9
    1. views
      1. fr
        1. error
          1. notfound.phtml
      2. en
        1. error
          1. notfound.phtml
  1. <h3>URL non trouvée</h3>
  2. <p>L'URL demandée n'a pas été trouvée sur ce serveur.
  3. Si vous avez tapé l'URL à la main, veuillez vérifier la saisie et réessayer.
  4. Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>URL not found</h3>
  2. <p>The requested URL was not found on this server.
  3. If you entered the URL manually please check your input and try again.
  4. If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>

Pour capturer les erreurs d'adressage, modifiez la ligne de la fonction dispatch dans le fichier library/engine.php qui retourne directement un document HTTP/1.0 404 Not Found :

  1.     $action=$args=false;
  2.     $r = route($path, $lang);
  3.     if (!$r) {
  4.         $action='error/notfound';
  5.     }

Si un chemin n'existe pas, $action est mis à error/notfound.

Entrez http://localhost/cms/site9/fr/nullepart puis http://localhost/cms/site9/en/nowhere dans la barre d'adresse de votre navigateur pour tester la page d'erreur en français et en anglais.

Pour retourner une erreur HTTP si le fichier du code d'une action est manquant, modifiez la fonction run dans le fichier library/engine.php :

  1.     $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
  2.     if (!is_file($file)) {
  3.         $action = 'error/internalerror';
  4.         $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
  5.         $args = false;
  6.     }
  7.     require_once $file;

Ajoutez le fichier internalerror.php dans le dossier actions/error avec le contenu suivant :

  1. function internalerror($lang) {
  2.     head('title', translate('http_internal_error:title', $lang));
  3.     head('robots', 'noindex, nofollow');
  4.  
  5.     $contact=true;
  6.     $banner = build('banner', $lang, compact('contact'));
  7.  
  8.     $contact_page=url('contact', $lang);
  9.     $content = view('error/internalerror', $lang, compact('contact_page'));
  10.  
  11.     $output = layout('standard', compact('header', 'banner', 'content'));
  12.  
  13.     header('HTTP/1.1 500 Internal Error');
  14.  
  15.     return $output;
  16. }

Ajoutez le titre de la page dans le fichier includes/strings.inc, en français et en anglais :

  1.         'http_internal_error:title'         => 'Erreur interne',
  1.         'http_internal_error:title'         => 'Internal Error',

Ajoutez les vues internalerror.phtml en français et en anglais dans les dossiers views/fr/error et views/en/error :

  1. <h3>Erreur interne</h3>
  2. <p>Le serveur a rencontré une erreur interne et n'a pas pu faire aboutir votre requête.
  3. Si vous pouvez décrire le problème, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>Internal error</h3>
  2. <p>The server encountered an internal error and was unable to complete your request.
  3. If you can describe the problem, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>

Pour verrouiller l'accès au site en période de maintenance, ajoutez les paramètres globaux $closing_time et $opening_time dans le fichier de configuration includes/config.inc :

  1. global $closing_time, $opening_time;
  2.  
  3. $closing_time=0;    // mktime(13, 0);
  4. $opening_time=0;    // $closing_time+30*60;

$closing_time donne l'heure de fermeture du service. $opening_time permet d'indiquer quand le service sera de nouveau disponible. Utilisez la function PHP mktime pour régler $closing_time. Ajoutez un nombre de secondes à $closing_time pour ajuster $opening_time ou laissez ce paramètre à 0 si le durée de l'interruption est indéterminée.

Modifiez la fonction dispatch dans le fichier library/engine.php pour prendre en compte le mode maintenance :

  1.     global $closing_time, $opening_time;

Donne accès aux paramètres globaux $closing_time et $opening_time.

  1.     $action=$args=false;
  2.     if ($closing_time and $closing_time <= time()) {
  3.         $action='error/serviceunavailable';
  4.         $args=array($closing_time, $opening_time);
  5.     }
  6.     else {
  7.         $r = route($path, $lang);
  8.         if (!$r) {
  9.             $action='error/notfound';
  10.         }
  11.         else {
  12.             list($action, $args) = $r;
  13.         }
  14.     }

Déclenche l'action error/serviceunavailable avec les paramètres $closing_time et $opening_time si $closing_time est postérieur à l'heure courante. Remarquez que $opening_time n'est pas évalué.

Ajoutez le fichier serviceunavailable.php dans le dossier actions/error avec le contenu suivant :

  1. function serviceunavailable($lang, $closing_time=false, $opening_time=false) {
  2.     head('title', translate('http_service_unavailable:title', $lang));
  3.     head('robots', 'noindex, nofollow');
  4.  
  5.     $contact=true;
  6.     $banner = build('banner', $lang, compact('contact'));
  7.  
  8.     $content = view('error/serviceunavailable', $lang, compact('closing_time', 'opening_time'));
  9.  
  10.     $output = layout('standard', compact('header', 'banner', 'content'));
  11.  
  12.     header('HTTP/1.1 503 Service Unavailable');
  13.  
  14.     return $output;
  15. }

serviceunavailable passe les paramètres $closing_time et $opening_time à la vue.

Ajoutez le titre de la page dans le fichier includes/strings.inc, en français et en anglais :

  1.         'http_service_unavailable:title'    => 'Service indisponible',
  1.         'http_service_unavailable:title'    => 'Service unavailable',

Ajoutez les vues serviceunavailable.phtml en français et en anglais dans les dossiers views/fr/error et views/en/error :

  1. <h3>Service indisponible</h3>
  2. <p>Le site est en maintenance<?php if (isset($closing_time) and $closing_time): ?> depuis <?php echo date('H\hi', $closing_time); ?><?php if (isset($opening_time) and $opening_time): ?>. Retour à la normale prévu à <b><?php echo date('H\hi', $opening_time); ?></b><?php endif; ?><?php endif; ?>.
  3. Veuillez nous excuser pour les désagréments causés par les travaux.
  4. Merci de réessayer plus tard.</p>
  1. <h3>Service unavailable</h3>
  2. <p>The site is under maintenance<?php if (isset($closing_time) and $closing_time): ?> since <?php echo date('H\hi', $closing_time); ?><?php if (isset($opening_time) and $opening_time): ?>. Back to normal scheduled at <b><?php echo date('H\hi', $opening_time); ?></b><?php endif; ?><?php endif; ?>.
  3. Please accept our apologizes for any inconvenience caused during renovations.
  4. Thank you for trying again later.</p>

Mettez $closing_time dans includes/config.inc à une heure dans le passé et $opening_time à une heure dans le futur. Entrez http://localhost/cms/site9/fr puis http://localhost/cms/site9/en dans la barre d'adresse de votre navigateur pour tester le verrouillage du site en français et en anglais. Essayez avec $opening_time à 0. Remettez $closing_time à 0 pour déverrouiller le site.

Un dernier effort pour installer une page spécifique pour tous les autres codes d'erreur HTTP que le site peut être amené à retourner.

Copiez toutes les fichiers suivants dans le dossier actions/error :

  1.     $content = view('error/badrequest', $lang, compact('contact_page'));
  2.  
  3.     $output = layout('standard', compact('header', 'banner', 'content'));
  4.  
  5.     header('HTTP/1.1 400 Bad Request');
  1.     $content = view('error/unauthorized', $lang, compact('contact_page'));
  2.  
  3.     $output = layout('standard', compact('header', 'banner', 'content'));
  4.  
  5.     header('HTTP/1.1 401 Unauthorized');
  1.     $content = view('error/forbidden', $lang, compact('contact_page'));
  2.  
  3.     $output = layout('standard', compact('header', 'banner', 'content'));
  4.  
  5.     header('HTTP/1.1 403 Forbidden');
  1.     $content = view('error/notimplemented', $lang, compact('contact_page'));
  2.  
  3.     $output = layout('standard', compact('header', 'banner', 'content'));
  4.  
  5.     header('HTTP/1.1 501 Not Implemented');

Définissez les titres des pages dans includes/strings.inc, en français et en anglais:

  1.         'http_bad_request:title'            => 'Mauvaise requête',
  2.         'http_unauthorized:title'           => 'Non autorisé',
  3.         'http_forbidden:title'              => 'Interdit',
  4.         'http_not_found:title'              => 'Non trouvé',
  5.         'http_internal_error:title'         => 'Erreur interne',
  6.         'http_not_implemented:title'        => 'Non implémenté',
  7.         'http_service_unavailable:title'    => 'Service indisponible',
  1.         'http_bad_request:title'            => 'Bad Request',
  2.         'http_unauthorized:title'           => 'Unauthorized',
  3.         'http_forbidden:title'              => 'Forbidden',
  4.         'http_not_found:title'              => 'Not Found',
  5.         'http_internal_error:title'         => 'Internal Error',
  6.         'http_not_implemented:title'        => 'No Implemented;',              
  7.         'http_service_unavailable:title'    => 'Service unavailable',

Copiez toutes les vues suivantes dans views/fr/error pour les versions françaises et views/en/error pour les versions en anglais :

  1. <h3>Requête erronée</h3>
  2. <p>Le service a reçu une requête mal formulée ou incomplète qui n'a pas pu être interprétée.
  3. Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>Bad request</h3>
  2. <p>The service has received a malformed or incomplete request which could not be interpreted.
  3. If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
  1. <h3>Autorisation requise</h3>
  2. <p>Ce serveur n'a pas été en mesure de vérifier que vous avez l'autorisation d'accéder à l'objet demandé.
  3. Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>Authentication required</h3>
  2. <p>This server could not verify that you are authorized to access the requested object.
  3. If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
  1. <h3>Accès interdit</h3>
  2. <p>Vous n'avez pas le droit d'accéder à l'objet demandé.
  3. Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>Access forbidden</h3>
  2. <p>You don't have permission to access the requested object.
  3. If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
  1. <h3>Action non implémentée</h3>
  2. <p>Le service n'est pas en mesure d'effectuer l'action demandée.
  3. Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
  1. <h3>Action not implemented</h3>
  2. <p>The service is not able to run the requested action.
  3. If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].