ver solucionar solucion solicitud servidor recurso que página puede provocar procesar problema mostrar interno hay funciona esta error elempleo ejecutar con como busca ahora php apache

php - solucionar - provocar un error 500



Desencadenar el error interno del servidor 500 en PHP y mostrar la página de error de Apache (9)

¿Cómo puedo desencadenar 500 errores de servidor interno o 404 de página no encontrada en PHP?

Para 500 Internal Server Error, he intentado con el 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?

Por favor guía ...


Aparentemente hay una función llamada http_response_code que te permitirá configurar el código de respuesta de manera apropiada. Si eso no funciona (hay una nota en la documentación sobre que posiblemente solo esté en SVN), entonces la función de header puede tomar un argumento de código de respuesta opcional:

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

Esto debería indicar a Apache correctamente.


Después de una discusión tan completa sobre el conocimiento, creo que no hay un código php que pueda mostrar el error de 500 Internal Server Error por defecto. La solucion es :
1. Cree una carpeta llamada http500 al lado del archivo php.
2. Cree un archivo .htaccess en él y agregue el siguiente código:

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

  1. Código de redireccionamiento de PHP:

encabezado (''ubicación: http500 /'');


En PHP 5.5 => "encabezado (" tester.php ", verdadero, 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.


Podrías simplemente copiar los documentos de error de Apache en tu raíz web (o enlazarlos simbólicamente) y usar el header() para establecer los códigos de error y con esos documentos como salida. Probablemente sea mejor a menos que tengas 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, solo inserta un error en tu código.

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

El script PHP generará una excepción, lo que dará como resultado una página de error Apache 500 normal. (Pero tenga en cuenta la advertencia de que esto solo dará como resultado un error de Apache si la configuración de inicio de PHP display_errors está establecida 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. no conoce la configuración de su servidor de producción, tendrá que probar esto para ver si funciona).

Para 404, creo que lo mejor que puede hacer es redirigir a una página que no existe. 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án el redireccionamiento, simplemente se redirigirán silenciosamente y rápidamente a una página inexistente, lo que da como resultado un error Apache 404 regular. Por supuesto, la url habrá cambiado y algunos usuarios podrían notarlo. Si eso no es aceptable, quizás pueda lograr resultados similares utilizando Apache mod_rewrite para reescribir el back-end de url en una ubicación inexistente.

Para responder a varios comentarios: establecer el código de respuesta a través del 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 quieres los documentos de error de Apache , debes forjarlos (según mi sugerencia inicial de simplemente copiar los documentos de error en tu raíz web), o tendrás que engañar a Apache para que los devuelva (según mi sugerencia de copia de seguridad) .


Probablemente sea 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 activará una respuesta de 500 ISE, mostrará la página de error 500 predeterminada y luego detendrá el script. Obviamente, deberá modificar la ubicación del archivo incluido


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

Puede representar un elemento de marco flotante en su vista, y luego establecer su altura y ancho al 100% en caso de que se esté preparando para el error.

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

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

ESE DIJO

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 como resultado un código de error adecuado para todos los usuarios, y también un seguimiento de pila para dev si establece la variable $ env en ''dev'' en su pila de desarrollo.

Sin redireccionamiento, sin hackers, seguro a menos que necesite exponer un error, no lo hará. :)


Sé que este es un hilo viejo, pero cuando busqué en Google, salta como la primera respuesta. Estaba intentando descubrir cómo hacerlo en estos días, así que creo que debería publicar mi solución a partir de 2018.

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

Aquí está 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 puede ver, todos los errores 4xx y 500 se redireccionan 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émosla y centrémonos en error.php por ahora.

Aquí hay 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 resumen, recibe el código de estado HTTP de Apache a través de http_response_code() , y simplemente clasifica el código de estado en dos categorías: Error interno del servidor y Error no interno del servidor. 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, para que no haya molestos "encabezados ya enviados". 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 se puede adivinar, uno de los dos contenidos preparados se generará con los siguientes códigos php, uno para 500 y otro para 404.

Ahora regresemos a su pregunta.

Desea activar exactamente la misma página de error que Apache, y ahora puede simplemente llamar a ErrorPage::GenerateErrorPage() desde donde desee, siempre y cuando le proporcione los parámetros correctos ( TRUE for 500, FALSE for 404 in my case )

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 sea exactamente lo que esperaría de las páginas de error de Apache.

Aquí está mi ejemplo de una página de activación:

<?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 forma, puedo borrar todo lo que se emite antes de que ocurra la excepción, y enviar una página de Error interno del servidor 500 puro que se ve exactamente igual que Apache , sin ningún contenido en la página de activación ( phpInfo() en este caso). ob_start() y ob_clean() también se aseguran de que no haya "encabezados ya enviados" , porque nunca se enviará nada a menos que llame a 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.


simplemente no puede desencadenar páginas de error apache de código php sin redirección de hackers como lo propone 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 tu php.ini sobre el manejo de errores y la verbosidad .

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 implementar correctamente un controlador personalizado de excepción y error a través de set_error_handler() y set_exception_handler() , respectivamente, use header() para enviar al cliente la información de estado http adecuada y (si es necesario) generar páginas de error.


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, necesitará un buffer de salida ON para poder usar la función php header() después de usar cualquier función de salida como echo .