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ć.
