Esto debería ser lo más fácil de hacer, pero por alguna razón simplemente no puedo hacerlo.
Estoy tratando de obtener una página amigable de error estático para reemplazar los desagradables 500 escenarios. Por ahora solo estoy tratando de replicar una situación 500 en mi máquina local (Drupal 7 ejecutándose en MAMP) agregando algunos caracteres basura en la parte superior de mi template.php en mi tema, lo que desencadena una situación 500, pero para alguna razón la directiva ErrorDocument en mi .htaccess
archivo de configuración o Apache no tiene ningún efecto.
Lo que estoy haciendo es simplemente esto:
ErrorDocument 500 /500.html
Y tengo la página html estática más simple en la raíz de mi sitio con el nombre de 500.html.
Aún así, cuando intencionalmente rompo template.php, obtengo la temida White Screen Of Death en lugar de mi amigable página de error amigable.
¿Qué estoy haciendo mal aquí? Lo he hecho mil millones de veces en configuraciones que no son de Drupal, pero no puedo entenderlo.
ACTUALIZACIÓN : Parece que esta pregunta es bastante redundante en mi caso de uso específico en este momento, ya que la nube de desarrollo de Acquia que utilizamos para ejecutar la aplicación en cuestión ni siquiera admite la personalización de páginas de error de la serie 500 en este momento. Esperamos que implementen soporte para eso pronto.
fuente
drupal_add_http_header('Status', '503 Service Unavailable');
a su 500.html?Respuestas:
500 páginas de error son estrictamente páginas de error del servidor. Una vez que el servidor entrega la ejecución a PHP, Drupal / PHP es responsable de servir su propia página de error. Puede intentar decirle a Drupal que redirija al usuario a una página de error personalizada, junto con un encabezado de estado HTTP 500, cuando recibe ciertos errores dentro de un
try...catch
bloque.Sin embargo, tenga en cuenta que algunos WSOD pueden ocurrir a nivel del sistema y podrían causar un error fatal que detenga inmediatamente la ejecución y posiblemente impida la
catch
ejecución . Un ejemplo de esto es cuando su base de datos no está ajustada correctamente para manejar consultas de cierto tamaño (como cuando se realizan operaciones de revertir todas las operaciones): la base de datos puede bloquearse, lo que le proporciona un insta-WSOD.Diría que lo mejor que puede hacer es verificar sus registros de errores de apache, MySQL y PHP, y tratar de aislar la causa raíz de WSOD caso por caso, en lugar de tratar de ocultarlos con página de error Si bien los errores que causan las típicas páginas de error de 500 servidores a veces son inevitables, y tener páginas de error de servidor personalizadas en producción es factible, tener WSODs en vivo no lo es.
Parece que tiene las páginas de error del servidor configuradas correctamente. ¡Solo necesita hacer la distinción de que las páginas de error típicas del servidor! = WSOD. Las páginas de error del servidor pueden activarse debido al alto tráfico y los cuellos de botella de recursos, pero en realidad no debería haber que ocurran WSOD en la producción, punto. Esto suele suceder debido a una codificación, optimización o configuración deficientes. Si aún ve un WSOD, asegúrese de encontrar primero (y resolver) la causa raíz del problema, en lugar de intentar aplicarle una curita.
fuente
Está obteniendo WSOD porque desactivó el informe de errores en php.ini. Este es un problema de seguridad: si tiene un error y el pirata informático ve de qué se trata, puede utilizarlo para piratear el sitio.
Sin embargo, si desea interceptar el error, debe habilitar la visualización de los errores en php.ini (el ejemplo solo mostrará errores graves):
Y luego, puede configurar los documentos de error en el archivo htaccess:
Alternativamente, puede especificar los errores en el archivo settings.php de Drupal .
En NGINX:
Como está ejecutando Apache en MAMP, configúrelo en .htaccess. Recuerde que
AllowOverride
en la configuración de apache debe estar activado (generalmente lo está).fuente
ErrorDocument
directiva para 500 respuestas en Drupal no funciona en mis pruebas¿Has activado el informe de errores? (admin / config / development / logging -> Establecer todos los mensajes para mostrar mensajes de error )
Por defecto, Drupal muestra un WSOD como una característica de seguridad.
fuente
Supongo que la respuesta es "leer los documentos", ver https://www.drupal.org/node/195435
Entonces, básicamente, puede crear los archivos de plantilla nombrados
maintenance-page.tpl.php
ymaintenance-page--offline.tpl.php
codificar algunas configuracionessettings.php
.EDITAR:
No parece importar qué nivel
error_reporting
está ajustado en o si se ha establecidodisplay_errors
aon
ooff
. Cuando tenga unmaintenance-page--offline.tpl.php
archivo en su lugar, Drupal mostrará esta página cuando la base de datos desaparezca. Tampoco importa lo que haya configurado/admin/config/development/logging
en el lado del administrador. Si solo tiene errores de sintaxis, que era la situación del OP, que en realidad no desencadenará un 500, es un 200 con un error de PHP que se muestra u oculta según elphp.ini
display_error
conjunto. No sé de ninguna otra manera que no sea agregar su lógica personalizada de manejo de errores a través de su código personalizado según sea necesario.fuente
Reemplazar todos los WSOD por algo más requeriría piratear el núcleo: no desea hacer esto. Drupal define sus propios manejadores de errores en bootstrap.inc y errors.inc. Si tuviera que perder el tiempo con ese código, tendría que asegurarse de tener en cuenta todas las cosas que podrían estar mal cuando la ejecución llegara a esta etapa (sin base de datos, sin motor de temas, sin tema, sin configuración, etc.).
fuente
Hice un proyecto de sandbox para hacer esto.
Pude lograr esto extendiendo HttpExceptionSubscriberBase en /src/EventSubscriber/fivehundredEventSubscriber.php
Y deberá agregar el servicio en su module.services.yml
fuente