PHP/Tutorials/404-Fehlerseite

Aus SELFHTML-Wiki
< PHP‎ | Tutorials
Wechseln zu: Navigation, Suche

Unter einer 404-Fehlerseite versteht man eine Seite, die beim Aufruf einer nicht existierenden URL erscheint. Der HTTP-Statuscode „404“ besagt file not found (englisch für Datei nicht gefunden) und so ähnlich lautet auch der Inhalt der meisten Seiten.

In diesem Artikel lernen Sie, wie Sie eine Fehlerseite durch individuelle Informationen aufwerten können.

Vorüberlegungen

Jedes halbwegs gut besuchte Webangebot kennt das Problem: im Laufe der Zeit werden durch Umstrukturierungen respektive Erneuerungen bestimmte Dateien bzw. Verzeichnisse auf dem Webserver entfernt. Manchmal werden Seiten durch neue ersetzt, manchmal ersatzlos gestrichen. In jedem Fall aber würde der Versuch eines Benutzers, die Seite aufzurufen (z. B. aus Lesezeichen im Browser oder über einen Link auf einer anderen Webseite) mit einem HTTP-Status 404 (Objekt nicht gefunden) fehlschlagen.

Zwar gibt es die Möglichkeit, falls sich nur der URL des Dokuments ändert, an der ursprünglichen Stelle eine HTML-Seite mit einer Umleitung mittels meta-Angabe bzw. einer 301er-Weiterleitung zu platzieren, jedoch kann gerade ersteres bei größeren Projekten schnell für Verwirrung sorgen, da der Überblick über aktuelle Dokumente und Umleitungsseiten verloren geht.

In diesem Tipp wird eine Idee vorgestellt, nach der ein zentrales PHP-Skript alle Anfragen nach nicht vorhandenen Seiten (sog. 404-Fehler) verarbeitet und je nach angeforderter URL einen Hinweistext ausgibt. Dieses Vorgehen ist sehr elegant, da ältere URIs nach wie vor "erreichbar" sind und Hinweise auf den Verbleib des angeforderten Dokumentes an zentraler Stelle gepflegt werden können.

Beachten Sie: Das im folgenden vorgestellte Skript benötigt eine 404-Fehlerumleitung. D.h. der Webserver muss so eingestellt sein, dass er als Fehlerseite für den HTTP-Fehler 404 (genau genommen ist es kein Fehler, sondern ein Status) auf dieses Skript verweist. Das erste Listing zeigt eine .htaccess-Datei, für den Apache-Webserver, die diese Funktionalität bereit stellt.

.htaccess-Datei

ErrorDocument 404 /messages/404.php   

Mit der ErrorDocument-Direktive wird einer HTTP-Fehlernummer ein entsprechendes Dokument zugewiesen. In diesem Fall soll der Webserver bei einem Fehler 404 das Dokument /messages/404.php ausliefern.

Beachten Sie: Ihr Webserver muss derartige Eingriffe in die Konfiguration erlauben. Am besten ist, es einfach auszuprobieren. Das gezeigte Beispiel wurde dem weit verbreiteten Apache-Webserver getestet. Bei anderen Webservern ist möglicherweise eine andere Konfiguration für Fehlerdokumente notwendig.

PHP

phpinfo.php
 1 <?php
 2   $descriptions = array(
 3     '/sfx/catan.shtml' => 'Startseite zu einem Special über das Spiel "Die Siedler von Catan". Diese Seite wurde mangels Interesse ersatzlos eingestellt.',
 4     '/frameset.htm' => 'Das Frameset der allerersten speedesign.de-Homepage. Heute arbeitet speedesign.de komplett ohne Frames. Als Ersatz dient die <a href="/index.html">neue Startseite</a>.',
 5     '/dfg/einfuehrung.shtml','Einführung in die Digitalfotografie. Das Dokument ist veraltet. Der neue Fotografie-Bereich wird in Kürze online gestellt.',
 6     '/sfx/catan.html' => 'Unterseite zu einem Special über das Spiel "Die Siedler von Catan". Diese Seite wurde mangels Interesse ersatzlos eingestellt.',
 7     '/images/autor.gif' => 'Dieses Bild gibt es nicht mehr. Es gibt keinen Ersatz dafür.',
 8     '/kon/inhalt.htm' => 'Alte Kontaktseite. Eine neue Version finden Sie im <a href="/other/impressum.php">Impressum</a>.',
 9     '/intro.htm' => 'Startseite des alten Webs. Wurde durch die <a href="/index.html">neue Startseite ersetzt</a>.',
10     '/cgi-bin/speedcms.pl?show=mun/mun.cms' => 'Fränkische Mundart. Das Projekt wurde leider eingestellt.'
11  );
12 
13   // Standardtext für nicht bekannte Seiten
14   $text = sprintf(
15     'Die angeforderte Seite %s scheint es noch nie auf diesem Server gegeben zu haben. '
16     . 'Bitte prüfen Sie die Schreibweise oder gehen Sie zur <a href="/">Startseite</a>.',
17     $_SERVER['REDIRECT_URL']
18   );
19 
20   // Ist die angeforderte Seite bekannt?
21   if (array_key_exists($_SERVER['REDIRECT_URL'], $descriptions)) { 
22     $text = $descriptions[$_SERVER['REDIRECT_URL']];
23   }
24 
25   //Ausgabe des Fehlertextes
26   printf('<p>%s</p>', $text);

Nach der Einleitung des PHP-Codeblocks folgt die Definition des assoziativen Arrays $descriptions. Das Array enthält als Schlüssel den URL des (nicht mehr vorhandenen) Dokuments relativ zum Wurzelverzeichnis. Als Wert wird ein Beschreibungstext angegeben, welcher auch HTML-Code enthalten kann (für Links etc.).

In Zeile 17 wird über das superglobale Array $_SERVER der angeforderte Pfad in den Standardtext eingefügt. Dann wird geprüft, ob es in den Schlüsseln von $descriptions einen zu diesem Pfad passenden Eintrag gibt. Ist dies der Fall, wird der zuvor definierte Text in der Variablen $text mit dem passenden Eintrag überschrieben. Schliesslich wird die Meldung ausgegeben.

Beachten Sie: Der Hinweis auf die Datei autor.gif macht nur bedingt Sinn, da er ja bei Bildern, die per img-Tag eingebunden sind, nicht sichtbar wird. Für diesen Fall könnte man das Skript erweitern, dass es im Falle von Bildern eine entsprechende Ersatz-Grafik als Datenstrom zurückliefert. Ein solcher Ausbau würde den Rahmen dieses Tipps jedoch sprengen.

Fazit

Der oben gezeigte Ansatz funktioniert im Apache mit seinen htaccess-Dateien. Bei anderen Webservern wie dem NGINX werden keine .htaccess-Dateien unterstützt.

In PHP kann der HTTP-Statuscode mit der folgenden PHP-Funktion gesendet werden:

 http_response_code(404);

Siehe auch: PHP-Manual (http_reponse_code)

In Perl würde man wie folgt vorgehen

 #!/usr/bin/perl

 use strict;
 use warnings;

 print "Status: 404 Not Found\r\n";
 print "Content-Type: text/html\r\n\r\n";

 print "<h1>404 File not found!</h1>";

um den Statuscode, eventuell gefolgt von einer besseren Antwort zu senden.

Beachten Sie: Das ist besonders wichtig, wenn der Server so konfiguriert ist, dass alle Anfragen auf ein Skript oder Programm umgeleitet werden, welches die Antwort erzeugt.
Im schlimmsten Fall würden im Fall einer Anfrage nach einer nicht vorhandenen Ressource positiv geantwortet werden (Statuscode 200) und diese Antwort womöglich z.B. in Suchmaschinen übernommen. Wenn viele solcher Links dann nicht funktionieren kann es sein, dass Suchmaschinen die Site nachrangig behandeln, möglicherweise geraten ungewollte und das Ansehen des Webseitenbetreibers schädigende URLs in die Ergebnislisten.

Siehe auch


Weblinks