Freundliche Fehlerseite zum Ersetzen von WSOD

10

Dies sollte die einfachste Sache sein, aber aus irgendeinem Grund kann ich es einfach nicht schaffen.

Ich versuche, eine benutzerfreundliche statische Fehlerseite zu erhalten, um böse 500 Szenarien zu ersetzen. Im Moment versuche ich nur, eine 500-Situation auf meinem lokalen Computer (Drupal 7 läuft auf MAMP) zu replizieren, indem ich einige Mistzeichen oben in meine template.php in meinem Thema einwerfe, was eine 500-Situation auslöst, aber für Aus irgendeinem Grund hat die ErrorDocument-Direktive in meiner .htaccessoder Apache-Konfigurationsdatei keine Auswirkung.

Was ich tue, ist ganz einfach Folgendes:

ErrorDocument 500 /500.html

Und ich habe die einfachste statische HTML-Seite aller Zeiten im Stammverzeichnis meiner Website mit dem Namen 500.html.

Wenn ich jedoch absichtlich template.php kaputt mache, bekomme ich den gefürchteten White Screen Of Death anstelle meiner netten, freundlichen Fehlerseite.

Was mache ich hier falsch? Ich habe das eine Milliarde Mal in Nicht-Drupal-Setups gemacht, kann mich aber nicht mit diesem beschäftigen.


UPDATE : Es scheint, dass diese Fragen in meinem speziellen Anwendungsfall derzeit so gut wie überflüssig sind, da die Dev Cloud von Acquia, mit der wir die betreffende Anwendung ausführen, derzeit nicht einmal das Anpassen von Fehlerseiten der 500er-Serie unterstützt. Wir hoffen, dass sie bald Unterstützung dafür implementieren.

Tommi Forsström
quelle
Was passiert, wenn Sie drupal_add_http_header('Status', '503 Service Unavailable');Ihre 500.html hinzufügen ?
Amateur Barista

Antworten:

2

500 Fehlerseiten sind ausschließlich Serverfehlerseiten. Sobald der Server die Ausführung an PHP übergibt, ist Drupal / PHP dafür verantwortlich, seine eigene Fehlerseite bereitzustellen. Sie können versuchen, Drupal anzuweisen, den Benutzer zusammen mit einem HTTP 500-Statusheader auf eine benutzerdefinierte Fehlerseite umzuleiten, wenn bestimmte Fehler innerhalb eines try...catchBlocks empfangen werden .

Beachtencatch Sie jedoch, dass einige WSODs auf Systemebene auftreten können und einen schwerwiegenden Fehler verursachen können, der die Ausführung sofort anhält und möglicherweise die Ausführung verhindert . Ein Beispiel hierfür ist, wenn Ihre Datenbank nicht richtig für die Verarbeitung von Abfragen bestimmter Größe optimiert ist (z. B. wenn Sie einen Vorgang ausführen, bei dem alle Funktionen zurückgesetzt werden). Die Datenbank ist möglicherweise verstopft, sodass Sie ein insta-WSOD erhalten.

Ich würde sagen, das Beste, was Sie tun können, ist, Ihre Apache-, MySQL- und PHP-Fehlerprotokolle zu überprüfen und zu versuchen, die Grundursache von WSOD von Fall zu Fall zu isolieren, anstatt zu versuchen, sie mit einem hübschen zu vertuschen. Fehlerseite. Während die Fehler, die die typischen 500 Serverfehlerseiten verursachen, manchmal unvermeidbar sind und benutzerdefinierte Serverfehlerseiten in der Produktion möglich sind, ist es nicht möglich, dass WSODs live ausgeführt werden.

Es sieht so aus, als hätten Sie die Serverfehlerseiten richtig eingerichtet. Sie müssen nur unterscheiden, dass typische Serverfehlerseiten! = WSODs. Serverfehlerseiten können aufgrund von hohem Datenverkehr und Ressourcenengpässen ausgelöst werden. In der Produktion sollten jedoch keine WSODs auftreten. Diese treten normalerweise aufgrund einer schlechten Codierung, Optimierung oder Konfiguration auf. Wenn Sie immer noch ein WSOD sehen, stellen Sie sicher, dass Sie zuerst die Grundursache des Problems finden (und lösen), anstatt zu versuchen, ein Pflaster darauf anzuwenden.

Amateur Barista
quelle
4
Danke für deine Antwort. Sie haben absolut Recht mit der Grundursache / Behandlung von Symptomen. Dies ist jedoch für die Notwendigkeit netter Fehlerseiten irrelevant, da während der Lebensdauer eines Dienstes Fehler auftreten und es in solchen Situationen immer besser ist, die Situation den Benutzern gut mitzuteilen, als mit leeren Seiten oder generischem Schwarz auf Weiß "Serverfehler" -Seiten. Der Twitter Fail Wal als Beispiel. Das macht die Notwendigkeit einer professionellen Fehlerprofilerstellung nicht überflüssig, macht die Benutzer jedoch in der Zwischenzeit weniger wütend.
Tommi Forsström
1
In diesem Fall muss auch nicht zwischen den Schichten unterschieden werden, von denen der Fehler stammt (solange er sich unter dem http-Server befindet), da ich nur einen Sammelmechanismus für Fehler in der Anwendungsschicht benötige, unabhängig davon, ob die Datenbank abstürzt , jemand, der Mistcode begeht (und der unsere Testabdeckung besteht) und jede andere denkbare, aber unerwartete Fehlersituation. Wie in der Frage aktualisiert, ist dies für mich im Moment irrelevant, da die Entwickler-Cloud von Acquia das Anpassen von Fehlerseiten der 500er-Serie derzeit nicht unterstützt.
Tommi Forsström
"Die Entwickler-Cloud von Acquia unterstützt derzeit das Anpassen von Fehlerseiten der 500er-Serie nicht." Aww shucks, das ist gut zu wissen.
Amateur Barista
Obwohl dies fast die einzige Fliege in der Salbe mit Acquias mächtiger Dev Cloud ist und sie dies möglicherweise auch in naher Zukunft implementieren werden. Ich kann nicht hoch genug für die Dev Cloud sprechen. Es ist eine erstaunliche Plattform, auf der Drupal-Dienste ausgeführt werden können!
Tommi Forsström
1

Sie erhalten WSOD, weil Sie die Fehlerberichterstattung in der php.ini deaktiviert haben. Dies ist ein Sicherheitsproblem. Wenn Sie einen Fehler haben und der Hacker erkennt, was er ist, kann er ihn möglicherweise zum Hacken der Site verwenden.

Wenn Sie den Fehler jedoch abfangen möchten, müssen Sie die Anzeige der Fehler in der php.ini aktivieren (im Beispiel werden nur schwerwiegende Fehler angezeigt ):

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

Anschließend können Sie die Fehlerdokumente in der htaccess-Datei festlegen:

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

Alternativ können Sie die Fehler in der Datei settings.php von Drupal angeben .

In NGINX:

error_page 403 = /error.php?code=403;   
error_page 404 = /error.php?code=404;
error_page 500 = /error.php?code=500;

Da Sie Apache in MAMP ausführen, legen Sie es in .htaccess fest. Denken Sie daran, dass AllowOverridein der Apache-Konfiguration die Option aktiviert sein sollte (normalerweise).

Alexei Rayu
quelle
Das Festlegen einer ErrorDocumentDirektive für 500 Antworten in Drupal funktioniert in meinen Tests nicht
cdmo
500 Fehler können normalerweise nicht in Drupal eingestellt werden. Sie müssen vor Drupal festgelegt werden - in .htaccess, wenn Sie Apache verwenden. In NGINX - siehe das aktualisierte Ticket.
Alexei Rayu
Das ist es was ich meinte. Konnten Sie eine ErrorDocument-Direktive für 500 Fehler erhalten, die in einem htaccess oder einer vhost-Konfiguration festgelegt wurden, um tatsächlich für eine Drupal-Site zu funktionieren? Diese Anweisungen werden meiner Erfahrung nach ignoriert, Drupal übernimmt die Fehlerbehandlung.
CDMO
0

Haben Sie die Fehlerberichterstattung aktiviert? (admin / config / Entwicklung / Logging -> Set Alle Meldungen für Fehlermeldungen auf Display )

Standardmäßig zeigt Drupal ein WSOD als Sicherheitsfunktion an.

Patrick Kenny
quelle
Komisch genug, das ist eingeschaltet und ich bekomme immer noch WSOD.
Tommi Forsström
In diesem Fall handelt es sich wahrscheinlich um ein MAMP-Problem, nicht um ein Drupal-Problem. Versuchen Sie, die Fehlerberichterstattung in php.ini ( forum.mamp.info/viewtopic.php?f=2&t=8077 ) zu aktivieren. Die Fehleranzeige ist in MAMP standardmäßig deaktiviert.
Patrick Kenny
1
Ich kann PHP-Fehler gut angezeigt bekommen. Das ist nicht wirklich das Problem. Ich möchte in der Lage sein, etwas Freundliches anzuzeigen, wenn Fehler auftreten, wie beispielsweise Twitter's Fail Whale. Das kann ich nicht erreichen: Benutzerdefinierte Fehlerseiten für Fehler der 500er-Serie.
Tommi Forsström
0

Ich denke, die Antwort lautet "Lesen Sie die Dokumente", siehe https://www.drupal.org/node/195435

Also im Grunde können Sie die Vorlage Dateien mit dem Namen erstellen maintenance-page.tpl.phpund maintenance-page--offline.tpl.phpund hart Code einige Einstellungen in settings.php.

BEARBEITEN:

Es scheint nicht egal , was Niveau error_reportingeingestellt ist oder ob Sie setzen display_errorsauf onoder off. Wenn Sie eine maintenance-page--offline.tpl.phpDatei eingerichtet haben, zeigt Drupal diese Seite an, wenn die Datenbank nicht mehr verfügbar ist. Auch spielt es keine Rolle, was Sie auf /admin/config/development/loggingder Admin-Seite eingestellt haben. Wenn Sie nur Syntaxfehler haben, wie es die Situation des OP war, die tatsächlich keine 500 auslösen, ist es eine 200 mit einem PHP-Fehler, der je nach php.ini display_errorSatz entweder angezeigt oder ausgeblendet wird . Ich kenne keine andere Möglichkeit, als Ihre benutzerdefinierte Fehlerbehandlungslogik nach Bedarf in Ihren benutzerdefinierten Code einzufügen.

cdmo
quelle
Ich bin mir nicht sicher, warum ich hier abgelehnt wurde. Dies ist die Antwort, nach der ich gesucht habe, als ich das Kopfgeld festgelegt habe. Zum anderen können Sie error_prepend festlegen und an Standard-PHP-Fehlerbenachrichtigungen anhängen, wenn Sie Ihre Standardfehlerseite weiter ausarbeiten möchten.
CDMO
0

Um alle WSOD durch etwas anderes zu ersetzen, wäre ein Hacking-Core erforderlich: Sie möchten dies nicht tun. Drupal definiert seine eigenen Fehlerbehandlungsroutinen in bootstrap.inc und fehler.inc. Wenn Sie mit diesem Code herumspielen würden, müssten Sie sicherstellen, dass Sie alle Dinge berücksichtigt haben, die falsch sein könnten, wenn die Ausführung dieses Stadium erreicht hat (keine Datenbank, keine Theme-Engine, kein Theme, keine Konfiguration usw.).

Akrosman
quelle
Haben Sie jemals versucht, die PHP-Optionen error_append und error_prepend zu verwenden? Während die Fehlermeldung immer noch angezeigt wird, scheint es, als könnten Sie eine viel schönere 500-Erfahrung bieten (zugegeben, nicht alle PHP-Fehler, die einen Whitescreen technisch zu einer 500-Antwort führen, wie viele Syntaxfehler.)
cdmo
Wahr. In beiden Fällen gelangen Sie zum gleichen allgemeinen Punkt: Das können Sie nicht.
Akrosman
0

Ich habe ein Sandbox-Projekt gemacht , um dies zu tun.

Dies konnte ich erreichen, indem ich die HttpExceptionSubscriberBase in /src/EventSubscriber/fivehundredEventSubscriber.php erweiterte

    <?php
namespace Drupal\five_hundred\EventSubscriber;

use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\Serializer\SerializerInterface;

class five_hundredEventSubscriber extends HttpExceptionSubscriberBase {

      public function __construct($stack) {

        if(
          (
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getCode() == 500
          )||(
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode() == 500
          )
        ){
            $response = new Response();
            $errorDocumentHtml = 'html here';
            $response->setContent($errorDocumentHtml);
            $response->setStatusCode(500, '500 Internal Server Error');
            $response->send();
            die();
        }
      }

      /**
       * {@inheritdoc}
       */
      protected function getHandledFormats() {
        return array('html','');
      }


    }
?>

Und Sie müssen den Dienst in Ihrer module.services.yml hinzufügen

services:
  five_hundred.:
    class: Drupal\five_hundred\EventSubscriber\five_hundredEventSubscriber
    arguments: ['@request_stack']
    tags:
      - { name: event_subscriber }
ummdorian
quelle