Serwer Apache daje możliwość ustawienia własnej strony błędu 404. Jeśli mówić normalnie, a nie liczbami to 404 oznacza 'File not found', a po polsku 'Nie znaleziono pliku'. Taka sytuacja ma miejsce, gdy klijent rząda pliku, który nie istnieje.
Wszystko sprowadza się do ustawienia w pliku konfiguracyjnym dyrektywy ErrorDocument. Jej składnia wygląda następująco:
ErrorDocument KOD PLIK
Oto jakie postacie mogą przyjąć zapisy w pliku
ErrorDocument 400 /alias/plik.html
ErrorDocument 404 http://strona.pl
ErrorDocument 500 "Wewnetrzny blad serwera"
W praktyce najbardziej przydaje się pierwsza wersja :).
Cały problem sprowadza się do tego, czy administrator udostępnił obsługę plików .htaccess. Nie ma co liczyć na nią na darmowych serwerach, a i wiele płatnych na to nie pozwala. Drugim problemem jest ssi (serwer-slide includes). Gdy mamy obsługę .shtml możemy robić profesjonalne strony 404 na zamówienie ;).
Ja swój plik 404 definiuję w pliku .htaccess
Options +Includes #1
AddType text/html .shtml #2
AddOutputFilter INCLUDES .shtml #3
ErrorDocument 404 /test.shtml #4
ErrorDocument 403 /usr/splatch/www/test.shtml
Pierwsza linia włącza obsługę shtml, druga definiuje typ pliku, aby serwer nie wysłał pliku do przeglądarki. Trzecia linia powoduje, że pliki .shtml zostaną przepuszczone przez filtr (tak jakby parser). Ostatie linie to definicje błędów. Obie są poprawne z tym, że druga tylko pod linuksowymi serwerami.
Teraz trzeba ładnie poinformować użytkownika, że wystąpił mały zgrzyt przy żądaniu. Oto przykładowy plik błędu
<!--#if expr="$HTTP_REFERER" -->
Przykro nam,
ale plik <font color="ff6600"><b><!--#echo encoding="url" var="REQUEST_URI" --><b></font> nie istnieje w naszym serwise. Zglos ten blad koniecznie pod adres email <b><!--#echo encoding="url" var="SERVER_ADMIN" --></b>.Mozesz tez wypelnic <a href="error.php?id=<!--#echo encoding="url" var="REDIRECT_STATUS" -->&file=<!--#echo encoding="url" var="REQUEST_URI" -->&from=<!--#echo encoding="url" var="HTTP_REFERER" -->">formularz</a>.
<!--#else -->
Zadany plik <font color="ff6600"><b><!--#echo encoding="url" var="REQUEST_URI" --><b></font> nie istnieje w serwisie. Sprawdz, czy wpisales poprawnie adres url.
<!--#endif -->
Oto zmienne, jakie zostały użyte i ich znaczenie:
$HTTP_REFERER plik, z którego nastąpiło żządanie
$REQUEST_URI adres żądanego pliku w postaci /plik.html?dane=get
$REDIRECT_STATUS to kod błędu
$REDIRECT_URL czyli nazwa pliku np. /download.php
$SERVER_ADMIN email administratora (lepiej wstawić swój)
Schemat działania tego przykładu jest taki - jeśli żądanie nastąpiło z jakiegoś pliku to znaczy, że jest wadliwy link, co wypada załatać stąd na końcu link do formularza w php. W przeciwnym wypadku jest przekazywana wiadomość o złym adresie pliku, który został wpisany.
Po kliknięciu linku do formularza wystarczy ładnie obsłużyć formularz i wysłać na swój adres email. Te same zmienne działają przy w php.
Jeśli nie chcesz używać ssi możesz zrobić tak
<?php
if( $_SERVER['HTTP_REFERER'] )
{
$mail = 'adres@blad.pl';
$temat = 'Wadliwy link w serwisie';
$tresc = 'Wykryto wadliwy link. Zadanie nastapilo z '. $_SERVER['HTTP_REFERER'] .'. Uzytkownik zadal pliku '. $_SERVER['REQUEST_URI'];
//wyslij mail
mail( $mail, $temat, $tresc );
//...kod html...
}
else
{
//zle wpisany adres
//...kod html...
}
?>
Plik zapisujemy, wysyłamy na serwer i ustawiamy w pliku .htaccess Dyrektywę jak na początku ErrorDocument 404 /404.php.
Mam nadzieję, że nie otrzymacie zbyt wielu informacji o wadliwych linkach :). |