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.
A primera vista pensé que esto sería trivial de resolver. Pero parece que en realidad no es así. Así que +1 – GordonM
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