von Eric Horn.
|
|
Teil 1 |
In diesem Teil:
Die Realisierung ist denkbar einfach. Wir gehen einfach davon aus, dass wir schon im ersten Teil (Link) ein Dokument erstellt haben, dass standardmäßig als 404er-Dokument ausgegeben wird. Sinnvoller Weise sollte dieses Dokument nicht nur einen Fehlerhinweis enthalten, sondern irgend eine Hilfe für den Benutzer. Ich benutze hier meist Sitemaps oder zumindest eine Suchfunktion, so dass der Benutzer eine Chance hat, das gesuchte Dokument doch noch zu finden - vorausgesetzt natürlich, es ist noch vorhanden. Im Text der 404er-Seite sollte darauf hingewiesen werden, dass neben der Fehlerausgabe zugleich auch eine Benachrichtigung an den Webmaster erfolgt ist - das erhöht den positiven Eindruck des Benutzers im Falle eines Fehlers ungemein und macht zumindest schon einen Teil der Negativpunkte, die man sich durch einen Fehler auf den eigenen Seiten eingehandelt hat, wieder wett.
Das bisherige 404er-Dokument benennen wir nun einfach in 404.php3 um. Der Dateiname ist eigentlich egal, nur die Endung ist wichtig. Sie ist notwendig, damit der Server erkennt, dass das Dokument PHP-Anweisungen enthält und entsprechend vor der Übergabe an den Clienten durch den PHP-Interpreter ausgewertet (evaluiert) werden muss. Entsprechend muss auch in der Datei .htaccess der Eintrag für den 404er-Fehler verändert werden. An Stelle der bisherigen Anweisung muss dort nun stehen:
ErrorDocument 404 /404.php3
Ich gehe dabei davon aus, dass sich die Fehlerseite im Hauptverzeichnis befindet. Wichtig ist hier die absolute Adressierung mit führendem Slash ("/"), damit das Fehler-Dokument auch gefunden wird, wenn der 404er-Fehler in einem Unterverzeichnis auftritt. Keinesfalls darf aber mit voller Server-Angabe referenziert werden (also etwa mit "ErrorDocument 404 http://www.brauchbar.de/404.php3"), weil eine solche URL-Referenzierung dazu führt, dass bei einem 404er-Fehler vom Server-Programm ein Page-Request ausgeführt wird. Damit verliert aber der Server aber zugleich die Angaben, die wir im Folgenden noch brauchen werden: welches Dokument nicht gefunden werden konnte und von welcher Seite dieses nicht auffindbare Dokument aufgerufen wurde (also verlinkt ist). Diese beiden Angaben finden sich nämlich im Anschluss an einen 404er-Fehler in den Umgebungsvariablen REQUEST_URI (fehlende Datei) und HTTP_REFERER (aufrufendes Dokument).
Als nächstes brauchen wir also eigentlich nur noch das PHP-Programm. Um dies nun in unser Fehler-Dokument 404.php3 einzufuegen, öffnen wir mit einem Text- oder Quellcode-Editor den Quellcode der Seite und kopieren das folgende Programm an den Anfang. Es ist wichtig, dass der gesamte PHP-Block ganz zu Anfang der Datei zu stehen kommt, da bei der Mapping-Funktion die Weiterleitung an die neue Adresse geschieht, indem ein Location-Header gesendet wird. Wurde schon irgendeine andere Zeile übertragen (etwa vom Dokument das <html>-Tag), erzeugt die Übertragung des Location-Headers einen Fehler. Deshalb in jedem Fall den Code an erster Stelle in die Datei einfügen!
<?
$reportType = "0"; /* Benachrichtigungsart "0": per e-Mail */
/* "1": per LOG-Datei */
/* "2": beides */
$webmasterMail = "webmaster@horn-netz.de"; /* e-Mail-Adresse des Webmaster */
$errorFile = $DOCUMENT_ROOT."/404.log"; /* Dateiname der LOG-Datei */
$holeReferer = $HTTP_REFERER;
$holeDefekte = $REQUEST_URI;
if (isset($holeDefekte))
{
/* MAPPING-Teil */
if (file_exists($DOCUMENT_ROOT."/mapping.txt"))
{
$umleitung = file($DOCUMENT_ROOT."/mapping.txt");
if (is_array($umleitung))
{
while (list($key,$val) = each($umleitung))
{
$angabe = split(" ; ",$val);
if (strtolower($angabe[0]) == strtolower($holeDefekte))
{
$adresse = strtolower($angabe[1]);
}
}
}
}
if (isset($adresse))
{
header("Location: http://".$SERVER_NAME.$adresse);
exit;
}
else
{
/* ERROR-Teil */
if (isset($holeDefekte) and isset($holeReferer))
{
if (strpos($holeDefekte, "'mailto:") == 0)
{
$splitArray = parse_url($holeReferer);
$referingDomain = $splitArray["host"];
/* Setzen Sie in der folgenden Zeile Ihre Domainnamen ein,
bei mehreren durch "|" getrennt */
if (eregi("(www\.){0,1}(abitur-1994|horn-netz|deutschunterricht)\.de",
$referingDomain, $regs))
{
$body = "Fehler 404 verursacht durch aufgerufene Seite http://"
.$SERVER_NAME.$holeDefekte ."\n";
$body = $body."Fehler ausgeloest durch interne Seite "
.$holeReferer ."\n";
$body = $body."Bitte den angegebenen Link korrigieren!\n\n";
switch ($reportType == "0")
{
case "0":
mail($webmasterMail,"[EIG] Interner 404-Fehler",$body);
break;
case "1":
$handle = fopen($errorFile,"a");
fputs($handle,$body);
fclose($handle);
break;
case "2":
mail($webmasterMail,"[EIG] Interner 404-Fehler",$body);
$handle = fopen($errorFile,"a");
fputs($handle,$body);
fclose($handle);
break;
}
}
else
{
$body = "Fehler 404 verursacht durch aufgerufene Seite http://"
.$SERVER_NAME.$holeDefekte ."\n";
$body = $body."Fehler ausgeloest durch externe Seite "
.$holeReferer ."\n";
$body = $body."Bitte recherchieren und dem externen Webmaster Bescheid geben!\n\n";
switch ($reportType == "0")
{
case "0":
mail($webmasterMail,"[EIG] Externer 404-Fehler",$body);
break;
case "1":
$handle = fopen($errorFile,"a");
fputs($handle,$body);
fclose($handle);
break;
case "2":
mail($webmasterMail,"[EIG] Externer 404-Fehler",$body);
$handle = fopen($errorFile,"a");
fputs($handle,$body);
fclose($handle);
break;
}
}
}
}
}
}
?>
<html>
<head>
...
Die letzten Zeile (<html><head>...) markieren den Anfang des normalen HTML-Dokuments, das wir ja bereits erstellt haben.
Was muss nun noch angepasst werden? Eigentlich nur am Anfang des Dokuments unter $reportType die Art der Benachrichtigung ("0" steht für Benachrichtigung per e-Mail, "1" für Benachrichtigung durch Eintrag in die LOG-Datei, "2" durch beides gleichzeitig), unter $webmasterMail die e-Mail-Adresse, an die eine Benachrichtigung gehen soll und unter $errorFile den Dateinamen der LOG-Datei, in die hinein die 404er-Fehler protokolliert werden sollen. Je nachdem, welches Verfahren Sie zur Benachrichtigung verwenden (per Mail oder per Datei), muss natürlich nur der korrespondierende Eintrag verändert werden. Wenn Sie die Protokollierung per Datei erstellen, wird die LOG-Datei automatisch beim ersten Mal erstellt.
Als letzte Angabe müssen Sie noch im letzten Drittel des Scripts in der "eregi"-Anweisung den/die Namen Ihrer Domain(s) angeben. Tragen Sie dazu in den runden Klammern nur den Teil zwischen den Punkten ein. Im Beispiel habe ich meine Domains "www.abitur-1994.de", "www.horn-netz.de" und "www.deutschunterricht.de" verwendet. Wenn Sie z.B. nur die Domain "www.brauchbar.de" einsetzen wollen, tragen Sie in den runden Klammern nur "brauchbar" ein (ohne Anführungszeichen natürlich). Der Rest wird durch den regulären Ausdruck erzeugt. Wenn Sie mehrere Domains besitzen, wird jeder Name mit Hilfe eines vertikalen Strichs ("|", auf der Tastatur mit AltGr+"<" erzeugbar) voneinander getrennt. Benutzen Sie einen Unterserver (etwa www.meinserver.meinedomain.de oder nur meinserver.meinedomain.de), dann tragen Sie in Klammern "meinserver.meinedomain" ein. Liegen Sie mit Ihrer Homepage auf einem Server in einem Unterverzeichnis (etwa "www.meinedomain.de/meinaccount/), geben Sie nur "meinedomain" in den Klammern an, weil das Unterverzeichnis automatisch vom Server in die referenzierenden Variablen eingetragen wird. Sollten Sie einen Server nutzen, der eine andere Länderkennung als ".de" besitzt, müssen Sie das Script leicht erweitern. Im Folgenden eine Version der Zeile für die Domains "www.meine-seite.de" und "www.my-page.com":
if (eregi("((www\.){0,1}(meine-seite)\.de)|((www\.){0,1}(my-page)\.com)",
$referingDomain, $regs))
Nachdem die Datei 404.php3 nun auf den Server hochgeladen wurde, sollte eigentlich die Benachrichtigung funktionieren. Wichtiger Hinweis: Eine Benachrichtigung wird nur erstellt, wenn es eine referierende Seite gibt, das nicht gefundene Dokument also per Link aufgerufen wurde. Das heißt natürlich auch, dass man das Script nicht auf seine Funktionsfähigkeit hin testen kann, in dem man in die URL-Zeile irgendein Dokument "http://www.meine-seite.de/die-seite-gibts-nicht.html" einträgt und ENTER drückt. Hier erscheint dann nur die eigene 404er-Seite. Man muss zum Testen also eine Datei (nennen wir sie "test.html") erstellen, die auf eine solche fehlende Seite referenziert. Dann sollte man aber eine Benachrichtigung per e-Mail erhalten oder der Fehler in der LOG-Datei gespeichert werden. Will man die LOG-Dateien und Windows auswerten, muss Sie natürlich im ASCII-Modus vom Server geholt werden. Sobald man eine LOG-Datei auswertet, sollte man diese auf dem Server löschen, so dass die Aufzeichnung neu beginnt.
Der Mapping-Teil des PHP-Script benutzt die Funktion "Location" der direkten Header-Übertragung zur unmittelbaren Übergabe der Umleitung an den Browser. Manche Server (etwa der Server von 1&1) ist hinsichtlich PHP falsch konfiguriert, so dass diese Funktion kein Ergebnis liefert, also nicht auf die in der Mapping-Datei angegebene Seite umgeleitet wird. Sollte dies bei Ihnen auch der Fall sein, so müssen Sie nur die Zeilen
if (isset($adresse))
{
header("Location: http://".$SERVER_NAME.$adresse);
exit;
}
durch die folgenden ersetzen:
if (isset($adresse))
{
echo "<head>";
echo " <meta http-equiv=\"refresh\"
content=\"0;url=http://www.".$SERVER_NAME.$adresse."\">";
echo "</head>";
exit;
}
Dann müsste auch bei Ihrem Server die Umleitung funktionieren. Eventuell können Sie sich die "www."-Angaben in der abgeänderten Version sparen - das ist eine Sache des Ausprobierens.
|
|
Teil 1 | Teil 3 |
Eric Horn
http://www.horn-netz.de
|
