Renvoyer une erreur HTTP
Créez site9 en copiant site8.
- /cms
- ...
- site8
- 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 :
- /cms/site9
- actions
- error
- notfound.php
- error
- actions
- function notfound($lang) {
- head('title', translate('http_not_found:title', $lang));
- head('robots', 'noindex, nofollow');
- $contact=true;
- $banner = build('banner', $lang, compact('contact'));
- $contact_page=url('contact', $lang);
- $content = view('error/notfound', $lang, compact('contact_page'));
- $output = layout('standard', compact('banner', 'content'));
- header('HTTP/1.1 404 Not Found');
- return $output;
- }
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' :
- 'http_not_found:title' => 'Non trouvé',
En anglais dans le tableau 'en' :
- '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.
- /cms/site9
- views
- fr
- error
- notfound.phtml
- error
- en
- error
- notfound.phtml
- error
- fr
- views
- <h3>URL non trouvée</h3>
- <p>L'URL demandée n'a pas été trouvée sur ce serveur.
- Si vous avez tapé l'URL à la main, veuillez vérifier la saisie et réessayer.
- Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>URL not found</h3>
- <p>The requested URL was not found on this server.
- If you entered the URL manually please check your input and try again.
- 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
:
- $action=$args=false;
- $r = route($path, $lang);
- if (!$r) {
- $action='error/notfound';
- }
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 :
- $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
- if (!is_file($file)) {
- $action = 'error/internalerror';
- $file = ACTIONS_DIR.DIRECTORY_SEPARATOR.$action.'.php';
- $args = false;
- }
- require_once $file;
Ajoutez le fichier internalerror.php dans le dossier actions/error avec le contenu suivant :
- function internalerror($lang) {
- head('title', translate('http_internal_error:title', $lang));
- head('robots', 'noindex, nofollow');
- $contact=true;
- $banner = build('banner', $lang, compact('contact'));
- $contact_page=url('contact', $lang);
- $content = view('error/internalerror', $lang, compact('contact_page'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 500 Internal Error');
- return $output;
- }
Ajoutez le titre de la page dans le fichier includes/strings.inc, en français et en anglais :
- 'http_internal_error:title' => 'Erreur interne',
- '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 :
- <h3>Erreur interne</h3>
- <p>Le serveur a rencontré une erreur interne et n'a pas pu faire aboutir votre requête.
- Si vous pouvez décrire le problème, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>Internal error</h3>
- <p>The server encountered an internal error and was unable to complete your request.
- 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 :
- global $closing_time, $opening_time;
- $closing_time=0; // mktime(13, 0);
- $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 :
- global $closing_time, $opening_time;
Donne accès aux paramètres globaux $closing_time
et $opening_time
.
- $action=$args=false;
- if ($closing_time and $closing_time <= time()) {
- $action='error/serviceunavailable';
- $args=array($closing_time, $opening_time);
- }
- else {
- $r = route($path, $lang);
- if (!$r) {
- $action='error/notfound';
- }
- else {
- list($action, $args) = $r;
- }
- }
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 :
- function serviceunavailable($lang, $closing_time=false, $opening_time=false) {
- head('title', translate('http_service_unavailable:title', $lang));
- head('robots', 'noindex, nofollow');
- $contact=true;
- $banner = build('banner', $lang, compact('contact'));
- $content = view('error/serviceunavailable', $lang, compact('closing_time', 'opening_time'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 503 Service Unavailable');
- return $output;
- }
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 :
- 'http_service_unavailable:title' => 'Service indisponible',
- '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 :
- <h3>Service indisponible</h3>
- <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; ?>.
- Veuillez nous excuser pour les désagréments causés par les travaux.
- Merci de réessayer plus tard.</p>
- <h3>Service unavailable</h3>
- <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; ?>.
- Please accept our apologizes for any inconvenience caused during renovations.
- 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 :
- $content = view('error/badrequest', $lang, compact('contact_page'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 400 Bad Request');
- $content = view('error/unauthorized', $lang, compact('contact_page'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 401 Unauthorized');
- $content = view('error/forbidden', $lang, compact('contact_page'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 403 Forbidden');
- $content = view('error/notimplemented', $lang, compact('contact_page'));
- $output = layout('standard', compact('header', 'banner', 'content'));
- header('HTTP/1.1 501 Not Implemented');
Définissez les titres des pages dans includes/strings.inc, en français et en anglais:
- 'http_bad_request:title' => 'Mauvaise requête',
- 'http_unauthorized:title' => 'Non autorisé',
- 'http_forbidden:title' => 'Interdit',
- 'http_not_found:title' => 'Non trouvé',
- 'http_internal_error:title' => 'Erreur interne',
- 'http_not_implemented:title' => 'Non implémenté',
- 'http_service_unavailable:title' => 'Service indisponible',
- 'http_bad_request:title' => 'Bad Request',
- 'http_unauthorized:title' => 'Unauthorized',
- 'http_forbidden:title' => 'Forbidden',
- 'http_not_found:title' => 'Not Found',
- 'http_internal_error:title' => 'Internal Error',
- 'http_not_implemented:title' => 'No Implemented;',
- '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 :
- <h3>Requête erronée</h3>
- <p>Le service a reçu une requête mal formulée ou incomplète qui n'a pas pu être interprétée.
- Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>Bad request</h3>
- <p>The service has received a malformed or incomplete request which could not be interpreted.
- If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
- <h3>Autorisation requise</h3>
- <p>Ce serveur n'a pas été en mesure de vérifier que vous avez l'autorisation d'accéder à l'objet demandé.
- Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>Authentication required</h3>
- <p>This server could not verify that you are authorized to access the requested object.
- If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
- <h3>Accès interdit</h3>
- <p>Vous n'avez pas le droit d'accéder à l'objet demandé.
- Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>Access forbidden</h3>
- <p>You don't have permission to access the requested object.
- If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
- <h3>Action non implémentée</h3>
- <p>Le service n'est pas en mesure d'effectuer l'action demandée.
- Si vous pensez qu'il s'agit d'une erreur du serveur, merci de <a href="<?php echo $contact_page; ?>">nous contacter</a>.</p>
- <h3>Action not implemented</h3>
- <p>The service is not able to run the requested action.
- If you think this is a server error, please <a href="<?php echo $contact_page; ?>">contact us</a>.</p>
Commentaires