![]() |
PHP:
|
|
| |
| E-Mail: | |
|---|---|
| Homepage-URL: |
Bei Fragen zu diesem Beitrag bitte den Autor des Beitrags kontaktieren!
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. einem Hinweistext und einem entsprechenden Verweis) zu platzieren, jedoch kann dies
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.
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 zweite Listing zeigt eine .htaccess-Datei, für den Apache-Webserver, die diese Funktionalität bereit stellt.
1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2: <html>
3:
4: <head>
5: <title>404-Fehler</title>
6: <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
7: </head>
8:
9: <body bgcolor="#FFFFFF" text="#000000">
10:
11: <p><b style="color: red;">Fehler 404:</b> Das angeforderte Dokument wurde nicht gefunden.</p>
12: <p>Sie haben versucht, auf ein Dokument zuzugreifen, welches nicht oder nicht mehr existiert.</p>
13: <p>Nachfolgend erhalten Sie eine Beschreibung der Seite und einen Hinweis, ob es Ersatz gibt oder nicht:</p>
14:
15: <?php
16: $REDIR_DESCRIPTIONS = array(
17: '/sfx/catan.shtml' => 'Startseite zu einem Special über das Spiel "Die Siedler von Catan". Diese Seite wurde mangels Interesse ersatzlos eingestellt.',
18: '/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>.',
19: '/dfg/einfuehrung.shtml','Einführung in die Digitalfotografie. Das Dokument ist veraltet. Der neue Fotografie-Bereich wird in Kürze online gestellt.',
20: '/sfx/catan.html' => 'Unterseite zu einem Special über das Spiel "Die Siedler von Catan". Diese Seite wurde mangels Interesse ersatzlos eingestellt.',
21: '/images/autor.gif' => 'Dieses Bild gibt es nicht mehr. Es gibt keinen Ersatz dafür.',
22: '/kon/inhalt.htm' => 'Alte Kontaktseite. Eine neue Version finden Sie im <a href="/other/impressum.php">Impressum</a>.',
23: '/intro.htm' => 'Startseite des alten Webs. Wurde durch die <a href="/index.html">neue Startseite ersetzt</a>.',
24: '/cgi-bin/speedcms.pl?show=mun/mun.cms' => 'Fränkische Mundart. Das Projekt wurde leider eingestellt.'
25: );
26:
27: //Welche Seite wurde aufgerufen?
28: $REDIRECT_URL = $_SERVER['REDIRECT_URL'];
29:
30: //Ist die Seite bekannt?
31: if ($REDIR_DESCRIPTIONS[ $REDIRECT_URL ]) {
32: $TEXT = $REDIR_DESCRIPTIONS[ $REDIRECT_URL ];
33: } else {
34: $TEXT = 'Die angeforderte Seite ('.$REDIRECT_URL.') scheint es noch nie auf diesem Server gegeben zu haben.
35: Prüfen Sie die Schreibweise oder gehen Sie zur <a href="/">Startseite</a>.';
36: }
37:
38: //Ausgabe des Fehlertextes
39: echo "<p><b>$TEXT</b></p>";
40:
41: ?>
42:
43: </body>
44: </html>
Nach der Einleitung des PHP-Codeblocks in Zeile 15 folgt in Zeile 16 die Definition des
assoziativen Arrays $REDIR_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.). Die Definitionen für die einzelnen Dokumente finden in den Zeilen 17 bis 24 statt und können
beliebig fortgesetzt werden. In Zeile 28 wird über das
Superglobal
$_SERVER (ab PHP Version 4.1) die Servervariable
REDIRECT_URL in der
entsprechenden Variable abgelegt. In Zeile 31 wird geprüft, ob der Ausdruck $REDIR_DESCRIPTIONS[ $REDIRECT_URL ] wahr ist. Dies ist der Fall,
wenn zuvor ein entsprechender Eintrag gemacht wurde. Bei einem Treffer wird in Zeile 32 der zuvor definierte Text in die Variable
$TEXT geschrieben. Ansonsten wird die Variable in Zeile 34 mit einer Standardmeldung versehen. Schliesslich wird in
Zeile 39 die Meldung ausgegeben und in Zeile 41 der PHP-Codeblock geschlossen.
Der in Zeile 21 definierte 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.
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.
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.
Die folgenden Stellen werden empfohlen, um das obige Beispiel besser zu verstehen, oder um weitere Möglichkeiten und Details zu erfahren.
Freischaltung von .htaccess-Funktionen
ErrorDocument directive
W3C: Cool URIs don't change