Biała strona (WSOD, White Screen of Death, internal server error, HTTP error 500)

Przyczyny

Przyczyną braku komunikatu błędu jest wyłączone raportowanie błędów w konfiguracji PHP (ustawienie jak najbardziej słuszne na serwerze produkcyjnym i spotykane jako domyślne na różnych hostingach),

Przyczyny samego błędu bywają przeróżne:

  • zabronione dyrektywy w .htaccess (b.częste na współdzielonym hostingu)
  • błędy w samych modułach lub skórce, najczęściej niekompletne/uszkodzone/źle zakodowane pliki,
  • błędnie ustawiona obsługa PHP na koncie hostingowym – na przykład w CPanelu/Direct Admin włączone domyślnie PHP4 zamiast PHP5; czasem też problem z modułem nie dostosowanym do PHP 5.3,
  • niewłaściwe kodowanie znaków w pliku, który modyfikowaliśmy – być może dodaliśmy arkusz CSS albo szablon z błędnie zakodowanymi znakami, warto to sprawdzić usuwając na chwilę nasze pliki z serwera,
  • kod PHP wstawiony w któryś z bloków, segmentów, a może nawet jedną ze starych wersji segmentów,
Rozwiązania

Tak naprawdę nasze pierwsze zadanie sprowadza się do poznania jak brzmi komunikat błędu. Dopiero potem możemy szukać rozwiązania.

Mamy kilka sposobów aby dowiedzieć się co powoduje „białą stronę śmierci”.

Na serwerze testowym możemy pozwolić sobie na wyświetlanie błędów w przeglądarce. Ustawimy to ustawiając parametr w (przykład dla xampplite) C:\xampplite\php\php.ini


display_errors = On

Jeśli pracujemy ze stroną umieszczoną na koncie www możemy poprosić administratora o dostęp do dziennika błędów PHP dla naszej witryny, lub spytać go o możliwość logowania błędów do pliku.

Na witrynach produkcyjnych nie zaleca się ustawiania wyświetlania błędów w przeglądarce, ponieważ prowadzi do pokazania informacji, które nie powinny być ujawniane (nazwa bazy danych, nazwy zmiennych, funkcji).

Część z usługodawców pozwala na umieszczanie w katalogu z witryną własnego pliku php.ini, w którym możemy zmienić część konfiguracji. Jeśli jest taka możliwość, ustawimy logowanie do pliku poprzez następujące parametry:

display_errors = Off
log_errors = On
error_log = "php_error.log"

parametry te umieszczamy w pliku php.ini i sprawdzamy czy nasza konfiguracja faktycznie działa. Czasem należy odczekać kilka(naście) minut zanim zmiany w php.ini zostaną zauwazone przez serwer (należy szukać informacji w dokumentacji konta www jakie mamy). Jeśli dysponujemy własnym serwerem należy wykonać jego restart.

Kiedy już wiemy jaki jest komunikat błędu a mimo to nic on nam nie mówi, powinniśmy szukać pomocy przez wyszukiwarkę (jest duża szansa, że ktoś już miał ten problem), oraz na forum wsparcia.

Podobnie jak z błędem 500, możemy próbować wykluczyć hipotezę, że problemy sprawia któryś z modułów - aby wykluczyć lub potwierdzić tę przyczynę usuńmy na moment wszystkie dodatkowe skórki i moduły i sprawdźmy czy to pomogło. Jeśli tak – problem leżał w którymś z katalogów, które usunęliśmy.

Error 500 jest b. często powodowany przez zbyt restrykcyjną konfigurację dotyczącą dyrektyw jakie można umieszczać w pliku .htaccess. Zmień na chwilę nazwę tego pliku i sprawdź czy to pomogło. Jeśli tak to po kolei wyłączaj dyrektywy (umieszczając znak komentarza - # - przed linią). Zazwyczaj to jedna bądź kilka wybranych opcji umieszczonych w .htaccess powoduja błąd (np. followsymlinks czy indexes).

Nasz serwis działał zupełnie poprawnie aż tu nagle - zamiast treści pojawia się:

  • biała strona. Brak źródła (podgląd źródła również pokazuje pustkę), brak komunikatów błędu - nic.
  • jeden z komunikatów: http error 500, internal server error, wewnętrzny błąd serwera

Zwykle w logach serwera odnajdziemy komunikaty błędów PHP, bądź błędu 500 protokołu HTTP.