Własne strony błędów w htaccess

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

Twitter Obserwuj mnie na Blip.pl 

Dodaj komentarz

Twój komentarz

CommentLuv badge