42 votes

Déclencher l'erreur 500 Internal Server Error en PHP et afficher la page d'erreur Apache

Comment puis-je déclencher Erreur de serveur interne 500 o 404 Page non trouvée Erreurs Apache en PHP ?

Pour l'erreur 500 Internal Server Error, j'ai essayé le code suivant :

header("HTTP/1.0 500 Internal Server Error");

Mais il me montre une page blanche. Comment puis-je afficher l'erreur dans le format par défaut d'Apache ?

S'il vous plaît guidez..

19voto

Ben Lee Points 25935

Vous pouvez simplement copier les documents d'erreur d'Apache dans votre root web (ou faire un lien symbolique) et utiliser header() pour définir les codes d'erreur et avec ces documents comme sortie. C'est probablement la meilleure solution, sauf si vous avez une raison impérieuse de ne pas le faire. Mais au cas où cela ne fonctionnerait pas pour vous, il existe des alternatives (bien que peu pratiques).

Pour 500, il suffit de mettre un bug dans votre code.

<?php throw new Exception('Nooooooooooooooo!'); ?>

Le script PHP script lève une exception, ce qui donne lieu à une page d'erreur Apache 500 normale. (Mais attention, cela n'entraînera une erreur Apache que si le paramètre d'init PHP display_errors est réglé sur 0 . Dans la plupart des configurations de développement, ce n'est pas le cas. Dans la plupart des configurations de production, c'est le cas. Si vous ne connaissez pas les paramètres de votre serveur de production, vous devrez simplement tester ceci pour voir si cela fonctionne).

Pour les 404, je pense que le mieux que vous puissiez faire est de rediriger vers une page inexistante. Ce n'est pas exactement la même chose, mais cela pourrait convenir à vos besoins.

<?php header("Location: /i-dont-think-therefore-i-am-not"); ?>

Dans la plupart des navigateurs, les utilisateurs ne verront pas réellement la redirection, ils seront simplement redirigés silencieusement et rapidement vers une page inexistante, ce qui entraînera une erreur Apache 404 normale. Bien sûr, l'url aura changé et certains utilisateurs pourraient le remarquer. Si cela n'est pas acceptable, vous pouvez peut-être obtenir des résultats similaires en utilisant Apache mod_rewrite pour réécrire le backend url vers un emplacement inexistant.

Pour répondre à plusieurs commentaires : Définir le code de réponse via header() (ou d'une autre manière) ne donnera pas lieu au document d'erreur standard d'Apache. Il retournera simplement ce code de réponse avec votre propre sortie. Il s'agit d'un comportement intentionnel, conçu pour vous permettre d'avoir des documents d'erreur personnalisés, ou de définir des codes de réponse comme le stipulent les spécifications HTTP pour toute requête. Si vous voulez que le Apache vous devez soit les falsifier (comme je l'ai suggéré au départ en copiant simplement les documents d'erreur sur votre racine web), soit inciter Apache à les renvoyer (comme je l'ai suggéré par la suite).

13voto

Vin Points 871

Après une telle discussion, je pense qu'il n'y a pas de code php qui puisse afficher l'erreur 500 Internal Server Error par défaut. La solution est la suivante :
1. Créez un dossier nommé http500 à côté du fichier php.
2. Créez un fichier .htaccess et ajoutez le code suivant :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^])(.(*/
    RewriteRule ^])((a-zA
</IfModule>
  1. Code de redirection PHP :

header('location : http500/') ;

6voto

Etherealone Points 1289
function ISE()
{
  header('HTTP/1.1 500 Internal Server Error', true, 500);
  trigger_error('ISE function called.', E_USER_ERROR);//if you are logging errors?
}

Cependant, vous devez activer le buffer de sortie pour pouvoir utiliser php. header() après avoir utilisé une fonction de sortie comme echo .

4voto

Alpha G33k Points 1057

Je sais que c'est un vieux sujet, mais...

Vous pourriez rendre un élément iframe dans votre vue, puis définir sa hauteur et sa largeur à 100 % en cas d'erreur que vous vous préparez à traiter.

<?php header("HTTP/1.0 500 Internal Server Error"); http_response_code(500); ?>

<iframe src="page_displaying_apache_screenshot_fullscreen.html"></iframe>

CELA DIT

Je pense sincèrement que la meilleure solution moderne pour cela serait quelque chose comme :

<?php
header("HTTP/1.0 500 Internal Server Error");
http_response_code(500);
?>
<div class="panel-body">
    <h1>Error!</h1>
     <p>
         <?php

         // Then, in the view if your in dev env, print exception and stack trace
         if ($env === 'dev') 
         {
             throw new Exception('Uh oh! Something broke while adding a new user the db.');
         }
         else 
         {
             echo "Hold your butts, an error has occured.";
             die();
         }
         ?>
     </p>
   </div>

Il en résulterait un code d'erreur correct pour tous les utilisateurs, ainsi qu'une trace de pile pour dev si vous avez défini la variable $env à 'dev' sur votre pile dev. What the user sees with this, using PHP 5.4 installed with yum using CENTOS7 by default

Pas de redirection, pas de piratage, sécurisé sauf si vous devez exposer une erreur, il ne le fera pas. :)

3voto

Ben Johnson mk2 Points 56

Je suis probablement en retard, mais cette solution devrait fonctionner

header("HTTP/1.0 500 Internal Server Error");
include("/path-to-public-html/errors/500.php");
die();

Cela déclenchera une réponse 500 ISE, et affichera la page d'erreur 500 par défaut, puis arrêtera le script. Évidemment, vous devrez modifier l'emplacement du fichier inclus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X