To powinno być najłatwiejsze, ale z jakiegoś powodu po prostu nie mogę tego zrobić.
Próbuję uzyskać przyjazną stronę błędu statycznego, która zastąpi nieprzyjemne 500 scenariuszy. Na razie próbuję zreplikować sytuację 500 na mojej lokalnej maszynie (Drupal 7 działający na MAMP), wrzucając niektóre bzdury na górze mojego template.php w moim motywie, co powoduje sytuację 500, ale dla z jakiegoś powodu dyrektywa ErrorDocument w moim .htaccess
pliku konfiguracyjnym lub Apache nie ma wpływu.
To, co robię, jest po prostu następujące:
ErrorDocument 500 /500.html
I mam najprostszą jak dotąd statyczną stronę HTML w katalogu głównym mojej witryny o nazwie 500.html.
Mimo to, gdy celowo łamie template.php, otrzymuję przerażający Biały Ekran Śmierci zamiast mojej miłej przyjaznej strony błędu.
Co robię tutaj źle? Zrobiłem to miliard razy w konfiguracjach innych niż Drupal, ale po prostu nie mogę tego ogarnąć.
AKTUALIZACJA : Wygląda na to, że pytania te są obecnie zbyteczne w moim konkretnym przypadku użycia, ponieważ chmura deweloperska Acquia, której używamy do uruchamiania tej aplikacji, nie obsługuje obecnie nawet dostosowywania stron błędów z serii 500. Mamy nadzieję, że wkrótce wdrożą wsparcie.
źródło
drupal_add_http_header('Status', '503 Service Unavailable');
do pliku 500.html?Odpowiedzi:
500 stron błędów to wyłącznie strony błędów serwera. Gdy serwer przekaże wykonanie PHP, Drupal / PHP jest odpowiedzialny za wyświetlanie własnej strony błędu. Możesz spróbować powiedzieć Drupalowi, aby przekierował użytkownika na niestandardową stronę błędu wraz z nagłówkiem statusu HTTP 500, gdy otrzyma pewne błędy w
try...catch
bloku.Należy jednak pamiętać, że niektóre WSOD mogą wystąpić na poziomie systemu i mogą powodować błąd krytyczny, który natychmiast zatrzymuje wykonywanie i prawdopodobnie uniemożliwia
catch
wykonanie . Jednym z przykładów jest sytuacja, w której baza danych nie jest odpowiednio dostrojona do obsługi zapytań o określonym rozmiarze (na przykład podczas wykonywania operacji przywracania wszystkich operacji) - baza danych może się udławić, dając insta-WSOD.Powiedziałbym, że najlepszą rzeczą jest sprawdzenie dzienników błędów Apache, MySQL i PHP i próbowanie wyodrębnienia głównej przyczyny WSOD na podstawie indywidualnych przypadków, w przeciwieństwie do prób ukrywania ich za pomocą dość- strona błędu. Podczas gdy błędy, które powodują typowe 500 stron błędów serwera, są czasami nieuniknione, a produkowanie niestandardowych stron błędów serwera jest możliwe, nie jest możliwe, aby występowały WSOD na żywo.
Wygląda na to, że poprawnie skonfigurowano strony błędów serwera. Trzeba tylko rozróżnić, że typowe strony błędów serwera! = WSOD. Strony błędów serwera mogą być uruchamiane z powodu dużego ruchu i wąskich gardeł w zasobach, ale tak naprawdę nie powinieneś mieć problemów z produkcją WSOD, kropka. Zwykle dzieje się tak z powodu złego kodowania, optymalizacji lub konfiguracji. Jeśli nadal widzisz WSOD, upewnij się, że najpierw znajdziesz (i rozwiążesz) pierwotną przyczynę problemu, a nie próbujesz zastosować do niego band-help.
źródło
Otrzymujesz WSOD, ponieważ wyłączyłeś raportowanie błędów w php.ini. Jest to kwestia bezpieczeństwa - jeśli masz błąd, a haker zobaczy, co to jest, może potencjalnie użyć go do zhakowania witryny.
Jeśli chcesz przechwycić błąd, musisz włączyć wyświetlanie błędów w php.ini (w przykładzie będą widoczne tylko poważne błędy):
Następnie możesz ustawić dokumenty błędów w pliku htaccess:
Alternatywnie możesz podać błędy w pliku settings.php Drupala .
W NGINX:
Ponieważ używasz Apache w MAMP, ustaw go na .htaccess. Pamiętaj, że
AllowOverride
w konfiguracji apache powinno być włączone (zwykle tak jest).źródło
ErrorDocument
dyrektywy dla 500 odpowiedzi w Drupal nie działa w moich testachCzy włączyłeś raportowanie błędów? (admin / config / development / logowanie -> Ustaw wszystkie komunikaty o wyświetlaniu komunikatów o błędach )
Domyślnie Drupal pokazuje WSOD jako funkcję bezpieczeństwa.
źródło
Myślę, że odpowiedzią jest „przeczytaj dokumentację”, patrz https://www.drupal.org/node/195435
Zasadniczo możesz tworzyć pliki szablonów o nazwie
maintenance-page.tpl.php
imaintenance-page--offline.tpl.php
kodować niektóre ustawienia wsettings.php
.EDYTOWAĆ:
Wydaje się, że nie ma znaczenia, jaki poziom
error_reporting
jest ustawiony ani czy ustawiłeśdisplay_errors
naon
luboff
. Gdy maszmaintenance-page--offline.tpl.php
plik, Drupal wyświetli tę stronę, gdy baza danych zniknie. Nie ma również znaczenia, co ustawiłeś po/admin/config/development/logging
stronie administratora. Jeśli masz tylko błędy składniowe, co było sytuacją PO, to tak naprawdę nie wyzwoli 500, to jest to 200 z błędem PHP wyświetlanym lub ukrytym na podstawiephp.ini
display_error
zestawu. Nie ma innego sposobu niż dodanie niestandardowej logiki obsługi błędów w niestandardowym kodzie w razie potrzeby.źródło
Zastąpienie wszystkich WSOD czymś innym wymagałoby hakowania rdzenia: nie chcesz tego robić. Drupal definiuje własne programy obsługi błędów w bootstrap.inc i error.inc. Jeśli miałbyś zadzierać z tym kodem, musiałbyś upewnić się, że wziąłeś pod uwagę wszystkie rzeczy, które mogą być złe, gdy wykonanie osiągnie ten etap (brak bazy danych, brak silnika motywu, brak motywu, brak konfiguracji itp.).
źródło
Zrobiłem projekt piaskownicy, aby to zrobić.
Udało mi się to osiągnąć poprzez rozszerzenie HttpExceptionSubscriberBase w /src/EventSubscriber/fivehundredEventSubscriber.php
Musisz dodać usługę w module.services.yml
źródło