W webmasterce prędzej czy później, każdy będzie potrzebował obsługę błędów. Własne strony błędów w htaccess są dosyć proste do zrobienia. Jednak poza htaccess jest również PHP, które również opiszę. Aby na serwerze zadziałały własne strony błędów, musimy się upewnić, że jest zainstalowany moduł mod_rewrite.c. Jeśli tego modułu nie będzie, to ujrzymy obsługę błędów, ale będzie to standardowa obsługa Apache’a informująca o błędzie 500 – Internal Serwer Error. Niestety jest to ostatnia rzecz, którą każdy chciałby zobaczyć na własnej stronie. Aby temu zapobiec, należy użyć dyrektyty IfModule:
ErrorDocument 404 bledy.php
Jak zauważyliście, za wyświetlanie błędów odpowiada plik 'bledy.php’, lecz nie dostaje on żadnego parametru. Prawda jest taka, że jednak dostaje od Apache’a informację o błędzie. Jest ona zawarta w zmiennej $_SERVER[’REDIRECT_STATUS’]. Dzięki temu możemy zrobić taką obsługę, jaką chcemy.
switch($_SERVER['REDIRECT_STATUS']) { case 401: $trescBledu='Brak autoryzacji'; break; case 404: $trescBledu='Strona nie została odnaleziona'; break; } //funkcje wyświetlające komunikat o błędzie
Jeżeli chcemy być bardziej konkretni, to możemy również wyświetlić ścieżkę wpisaną przez użytkownika, która zaowocowała wywołanie tego skryptu.
W tym celu użyjemy standardowej zmiennej PHP $_SERVER, a konkretnie $_SERVER[’REQUEST_URI’]. Teraz możemy napisać cały skrypt obsługujący błędy:
switch($_SERVER['REDIRECT_STATUS']) { case 400: $trescBledu='Błędne zapytanie'; break; case 401: $trescBledu='Dostęp wymaga autoryzacji (np. hasło)'; break; case 402: $trescBledu='Wymagana opłata (obecnie niestosowane)'; break; case 403: $trescBledu='Zabroniony dostęp ze względu bezpieczeństwa'; break; case 404: $trescBledu='Nie znaleziono strony, najpopularniejszy komunikat'; break; case 405: $trescBledu='Niedozwolona metoda'; break; case 406: $trescBledu='Nie może zwrócić odpowiedzi'; break; case 407: $trescBledu='Wymagane uwierzytelnienie do serwera (podobne działanie jak 401)'; break; case 408: $trescBledu='Koniec czasu oczekiwania na zapytanie'; break; case 409: $trescBledu='Występowanie konfliktu między statusami zasobu'; break; case 410: $trescBledu='Usunięto zasób'; break; case 411: $trescBledu='Serwer odmawia realizacji ze względu na brak długości'; break; case 412: $trescBledu='Jeden z warunków jest nie do spełnienia'; break; case 413: $trescBledu='Zapytanie zbyt długie dla serwera'; break; case 414: $trescBledu='Adres URL za długi'; break; case 415: $trescBledu='Niezrozumiały komunikat dla serwera'; break; case 416: $trescBledu='Nie można obsłużyć zakresu zapytania'; break; case 417: $trescBledu='Oczekiwana wartość nie do zwrócenia'; break; case 500: $trescBledu='Wewnętrzny błąd serwera'; break; case 501: $trescBledu='Serwer nie może zwrócić odpowiedzi, ponieważ nie rozumie zapytania'; break; case 502: $trescBledu='Błąd bramy, niepoprawna odpowiedź od serwera nadrzędnego'; break; case 503: $trescBledu='Niedostępny, w danej chwili serwer jest przeciążony'; break; case 504: $trescBledu='Przekroczony czas bramy (brak odpowiedzi od nadrzędnego)'; break; case 505: $trescBledu='Nie obsługuje danej wersji HTTP'; break; default: $trescBledu='Nieznany błąd'; break; } wypiszPoczatekStrony(); echo'Niestety adres "'.$_SERVER['SCRIPT_URI'].'" nie jest obecnie dostępny, ponieważ wystąpił błąd '.$_SERVER['REDIRECT_STATUS'].' ('.$trescBledu.')'; wypiszKoniecStrony();
W tym przykładzie dla zaoszczędzenia miejsca, użyłem funkcji wypiszPoczatekStrony i wypiszKoniecStrony. Chyba nie muszę tłumaczyć za co są one odpowiedzialne i każdy może je sobie napisać.
Tym oto sposobem został stworzony skrypt obsługujący kody błędów. Jak widzicie, nie było to nic trudnego i każdy jest w stanie sobie z tym poradzić.