2011-12-31 28 views
34

¿Cómo puedo disparar 500 Error interno del servidor o Página 404 no encontrada Apache errors in PHP?Error interno del servidor Trigger 500 en PHP y muestra la página de error Apache

Por 500 Internal Server Error he intentado siguiente código:

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

Pero me muestra una página en blanco. ¿Cómo puedo mostrar el error en el formato predeterminado de Apache?

favor guiar ..

+1

A primera vista pensé que esto sería trivial de resolver. Pero parece que en realidad no es así. Así que +1 – GordonM

+1

Solo para lanzarlo a todos: estaba pensando que podrías incluir el documento de error original de Apache fuera de los archivos compartidos ('/ usr/share/httpd/error/HTTP_INTERNAL_SERVER_ERROR.html.var' para mí) y salir del script PHP Pero tengo un gran problema: ¿cómo harías para procesar el archivo .html.var? En Apache está configurado como 'AddHandler type-map var' pero no puedo encontrar nada que sea útil en PHP. – animuson

Respuesta

7

Después de una discusión tan completa sobre el conocimiento, creo que no hay un código php que pueda mostrar el error 500 Internal Server Error por defecto. La solución es:
1. Cree una carpeta llamada http500 junto al archivo php.
2. Crear un archivo .htaccess en ella y añadir siguiente código:

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

header('location : http500/');

+0

O en vez de incluso hacer el archivo php, simplemente navegue a ese directorio usted mismo. No obtuve el php para redirigirme. – agrublev

+0

Mi pregunta era activar 500 o 404 desde PHP. – Vin

+0

Si intenta depurar un problema, será extremadamente molesto cuando se lo redireccione fuera de la página que realmente está cometiendo un error. – paulgrav

13

Se podía copiar los documentos de error de Apache en su web raíz (o enlace simbólico en) y utilizar header() para establecer los códigos de error y con esos documentos como de salida. Probablemente sea mejor a menos que tenga una razón convincente para no hacerlo. Pero en caso de que no funcione para usted, hay algunas alternativas (aunque, alternativas de hacky).

Para 500, simplemente inserte un error en su código.

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

La secuencia de comandos PHP generará una excepción, dando como resultado una página de error Apache 500 normal. (Pero tenga en cuenta la advertencia de que esto solo generará un error Apache si la configuración de inicio PHP display_errors está configurada en 0. En la mayoría de las configuraciones de desarrollo, este no es el caso. En la mayoría de las configuraciones de producción, este es el caso. desconoce la configuración de su servidor de producción, solo tendrá que probar esto para ver si funciona.)

Para 404, creo que lo mejor que puede hacer es redireccionar a una página inexistente. No es exactamente lo mismo, pero podría serlo para tus propósitos.

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

En la mayoría de los navegadores, los usuarios no ver realmente la redirección, que se acaba de obtener en silencio y rápidamente redirigido a una página que no existe, lo que resulta en un error de regular de Apache 404. Por supuesto, la url habrá cambiado y algunos usuarios podrían notarlo. Si eso no es aceptable, quizás pueda lograr resultados similares usando Apache mod_rewrite para reescribir el back-end de la URL en una ubicación inexistente.

Para responder a varios comentarios: Establecer el código de respuesta a través de header() (o de alguna otra manera) no dará como resultado el documento de error estándar de Apache. Simplemente devolverá ese código de respuesta con su propia salida. Este es un comportamiento intencional, diseñado para que pueda tener documentos de error personalizados, o establecer códigos de respuesta como las especificaciones HTTP dictan en cualquier solicitud. Si desea los documentos de error Apache, debe forjarlos (según mi sugerencia inicial de simplemente copiar los documentos de error en su raíz web), o tendrá que engañar a Apache para que los devuelva (según mi copia de seguridad). sugerencia).

+7

Error fatal: excepción no detectada 'Excepción' con el mensaje 'Nooooooooooooooo!' –

+3

Blech. Realmente no hay necesidad de este tipo de hackers. –

+0

PHP hará eco de la excepción y se detendrá. No causará un error interno del servidor. Solo funciona en algunos marcos porque tienen controladores de excepciones para generar el error interno del servidor en una excepción no detectada – GordonM

0

Aparentemente hay una función llamada http_response_code que le permitirá establecer el código de respuesta de manera apropiada. Si eso no funciona (hay una nota en la documentación sobre el tema, posiblemente, siendo únicamente en SVN) entonces la función header puede tomar un argumento código de respuesta opcional:

header("HTTP/1.0 ...", true, 404); 

Esto debería indicar Apache correctamente.

+6

¿Por qué esto desencadenaría el documento de error de Apache? PHP todavía envía un documento 'Content-type: text/html' que no contiene contenido. ¿Eso simplemente se ignora mágicamente? Por favor explica más – animuson

+0

@animuson: ¿Lo has probado o especula? Si entiendo correctamente Apache, esto * debería * desencadenar es el manejo habitual de documentos de error. Puede depender de la configuración, por supuesto. –

+0

El código anterior me muestra una página en blanco. y para http_response_code() Me está dando un error: Llamar a la función indefinida http_response_code() – Vin

2

simplemente no se puede desencadenar páginas de error de Apache de código PHP sin hackery redirección según lo propuesto por ben lee porque la redirección de documentos de error es manejada por otra capa de la pila de su aplicación (específicamente, mod_core de apache).
cuando se ejecuta el script, es demasiado tarde.

el truco de obtener una página de error arrojando una excepción depende en gran medida de la configuración de su php.ini sobre error handling and verbosity.

http_response_code() actualmente solo existe en svn de php por lo que no está disponible en la mayoría de los entornos de producción que se supone que ejecutan una versión de lanzamiento oficial.

mi consejo es aplicar correctamente un error de medida y gestión de excepciones a través de set_error_handler() y set_exception_handler(), respectivamente, utilice header() para enviar la información de estado HTTP de cliente adecuado y (si es necesario) generar páginas de error.

+0

"truco de obtener una página de error lanzando una excepción" - Este "truco" solo establece el encabezado de código/respuesta de estado HTTP, aún no devuelve el documento de error de Apache. (Ver [mi comentario a la respuesta de Ben Lee] (http://stackoverflow.com/questions/8687390/how-to-trigger-500-internal-server-error-in-php#comment53891257_8687401)) Y 'http_response_code()' es solo un atajo para configurar el encabezado de código/respuesta de estado HTTP, no devuelve el documento de error de Apache. – MrWhite

+0

sí. eso es lo que escribí – glasz

6
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? 
} 

Sin embargo, se necesita una salida de amortiguación ON para poder utilizar la función php header() después de utilizar cualquier función de salida como echo.

0

En PHP 5.5 => "encabezado (" tester.php ", cierto, 500);" donde tester.php no existe. Funciona y me lleva a mi página de 500 :)

Lamentablemente, ninguno de los otros métodos enumerados aquí funcionó para mí por una razón u otra.

3

Probablemente soy bastante tarde, pero esta solución debería funcionar

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

Esto desencadenará una respuesta 500 ISE, y mostrar la página de error por defecto 500, y luego se detiene la secuencia de comandos. Obviamente tendrá que modificar la ubicación del archivo incluido

+0

Quería hacer este código general para que pueda funcionar en cualquier servidor. De acuerdo con su solución, aún puedo hacerlo creando una página personalizada "Error 500", pero quería mostrar la página de error de acuerdo con la configuración del servidor. – Vin

0

Sé que esto es un viejo hilo sin embargo ...

Usted podría hacer que un elemento iframe en su vista, y después fijar su altura y anchura a 100% en el caso del error que se está preparando para manejar.

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

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

los que se dice

realmente creo que la mejor solución moderna para esto sería algo así como:

<?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> 

Esto daría lugar a una adecuada código de error para todos los usuarios, y también un seguimiento de pila para dev si establece el $ env variable a 'dev' en tu pila de desarrollo. What the user sees with this, using PHP 5.4 installed with yum using CENTOS7 by default

Sin redirección, no hackeo, seguro a menos que necesite exponer un error, no lo hará. :)

0

Sé que este es un hilo viejo, pero cuando lo busqué en Google, salta como la primera respuesta. Yo estaba tratando de encontrar la manera de hacerlo en estos días, por lo que creo que debo publicar mi solución desde 2018.

Como todos ustedes han conocido, no, no se puede simplemente activar las páginas de error de Apache de PHP. No hay forma de hacerlo. Así que la mejor solución que pude encontrar, después de algunas investigaciones, es para usar una función de PHP para mostrar las páginas de error personalizadas, que se llama tanto de lo que especificó en Apache, como de la página que desea activar 500 Internal Server Error .

Aquí es mi conf de Apache:

ErrorDocument 400 /error.php 
ErrorDocument 401 /error.php 
ErrorDocument 403 /error.php 
ErrorDocument 404 /error.php 
ErrorDocument 500 /error.php 

Como se puede ver, todos los 4xx y 500 errores son redirigidos a un mismo archivo php. La razón por la que no utilizo archivos separados para cada código es otra cuestión que no tiene nada que ver con su pregunta aquí, así que olvidémoslo y concéntrese en error.php por el momento.

Estas son algunas líneas de error.php:

<?php 
require_once("error_page.php"); 

$relative_path = ""; 
$internal_server_error = FALSE; 

if (isset($_SERVER['REDIRECT_URL']) && $_SERVER['REDIRECT_URL'] != "") 
{ 
    $relative_path = $_SERVER['REDIRECT_URL']; 
    $internal_server_error = (http_response_code() >= 500); 
} 
else if (isset($_SERVER['REQUEST_URI'])) 
{ 
    $relative_path = $_SERVER['REQUEST_URI']; 
} 

ErrorPage::GenerateErrorPage($internal_server_error, $relative_path); 
?> 

En definitiva, se recibe el código de estado HTTP de Apache a través de http_response_code(), y simplemente categorizar el código de estado en dos categorías: Error interno del servidor y el error de servidor no Interna . A continuación, pasa la categoría a ErrorPage::GenerateErrorPage() que realmente genera el contenido de la página de error.

En ErrorPage::GenerateErrorPage(), hago algo como esto:

<?php 
http_response_code($internal_server_error ? 500 : 404); 
?> 

al comienzo de la función, por lo que no habrá ningún “headers already sent” molestos. Esta función generará una página de error completamente funcional con el código de estado HTTP correcto (o lo que esperábamos, al menos). Después de configurar el código de estado HTTP, como puede adivinar, se generará uno de los dos contenidos preparados siguiendo los códigos php, uno para 500, otro para 404.

Ahora regresemos a su pregunta.

desea disparar exactamente la misma página de error como lo hace Apache, y ahora sólo tiene que llamar al ErrorPage::GenerateErrorPage() desde donde quieras, siempre y cuando usted le da los parámetros correctos (TRUE de 500, FALSE de 404 en mi caso) .

Obviamente, debido a que las páginas de error de Apache son generadas por la misma función ErrorPage::GenerateErrorPage(), podemos garantizar que lo que active donde sea es exactamente lo que esperaría de las páginas de error de Apache.

Aquí es mi ejemplo de una página de disparo:

<?php 
ob_start(); 

require_once("error_page.php"); 

try 
{ 
    // Actual contents go here 
    phpInfo(); 
    throw new Exception('test exception'); 
} 
catch (Exception $e) 
{ 
    ob_clean(); 
    ErrorPage::GenerateErrorPage(TRUE); 
    ob_end_flush(); 
    exit(); 
} 

ob_end_flush(); 
?> 

La razón por la que uso ob_start() y ob_clean() es que, de esta manera, puedo borrar de salida nada antes de que ocurra la excepción, y enviar una pura 500 La página Internal Server Error que se ve exactamente igual que Apache da, sin ningún contenido en la página del disparador (phpInfo() en este caso). ob_start() y ob_clean() también asegúrese de que no haya "encabezados ya enviados", porque nunca se enviará nada a menos que llame al ob_end_flush().

La solución anterior se basa en lo que investigué en estos días. Hasta ahora, es muy bueno para mí, pero no estoy seguro de si es la forma correcta de hacerlo. Cualquier comentario, pregunta, pensamiento, sugerencia y mejora son bienvenidos.

Cuestiones relacionadas