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 .htaccess
oder 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.
quelle
drupal_add_http_header('Status', '503 Service Unavailable');
Ihre 500.html hinzufügen ?Antworten:
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...catch
Blocks empfangen werden .Beachten
catch
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.
quelle
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 ):
Anschließend können Sie die Fehlerdokumente in der htaccess-Datei festlegen:
Alternativ können Sie die Fehler in der Datei settings.php von Drupal angeben .
In NGINX:
Da Sie Apache in MAMP ausführen, legen Sie es in .htaccess fest. Denken Sie daran, dass
AllowOverride
in der Apache-Konfiguration die Option aktiviert sein sollte (normalerweise).quelle
ErrorDocument
Direktive für 500 Antworten in Drupal funktioniert in meinen Tests nichtHaben 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.
quelle
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.php
undmaintenance-page--offline.tpl.php
und hart Code einige Einstellungen insettings.php
.BEARBEITEN:
Es scheint nicht egal , was Niveau
error_reporting
eingestellt ist oder ob Sie setzendisplay_errors
aufon
oderoff
. Wenn Sie einemaintenance-page--offline.tpl.php
Datei 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/logging
der 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 nachphp.ini
display_error
Satz entweder angezeigt oder ausgeblendet wird . Ich kenne keine andere Möglichkeit, als Ihre benutzerdefinierte Fehlerbehandlungslogik nach Bedarf in Ihren benutzerdefinierten Code einzufügen.quelle
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.).
quelle
Ich habe ein Sandbox-Projekt gemacht , um dies zu tun.
Dies konnte ich erreichen, indem ich die HttpExceptionSubscriberBase in /src/EventSubscriber/fivehundredEventSubscriber.php erweiterte
Und Sie müssen den Dienst in Ihrer module.services.yml hinzufügen
quelle