0251 / 590 837 15
info@a-coding-project.de

Automatische 301-Weiterleitung beim 404-Fehler

404-Fehler (Seite nicht gefunden) sind für den Endanwender immer eine unschöne Sache. Sie kann zum Beispiel durch einen falsch gesetzten Link, oder eine umstrukturierte Seite zu Stande kommen. Neben dem User ist es auch schlecht für die Suchmaschinen, da der Link dadurch keine Wirkung mehr hat.

404 - File not Found

404 - File not Found

Ich habe für euch heute ein kleines Script, welches dem User automatisch mit einem 301-Redirect (Permanente Weiterleitung) an die richtige Seite leitet. Fangen wir mal an, eine 404-Seite einzurichten. Dafür muss man folgendes in die .htaccess oder in die vhosts schreiben:

ErrorDocument 404 /404.php

Nun wird im Falle des Fehlers auf die Seite 404.php weitergeleitet. Dort können wir dann entscheiden, welche Seite er vermutlich gemeint hat. Das machen wir mit MySQL. Alle Seiten müssen in einer Tabelle gespeichert werden. Für meine Demo habe ich mal folgendes genommen:

CREATE  TABLE `demo_301`.`pages` (
  `page` VARCHAR(255) NOT NULL ,
  PRIMARY KEY (`page`) );
INSERT INTO `demo_301`.`pages` (`page`) VALUES ('hallo-welt.html');
INSERT INTO `demo_301`.`pages` (`page`) VALUES ('testseite.html');

MySQL bietet die Funktion SOUNDS LIKE, mit denen wir die Seiten finden können, die unserer Seite ähnlich sind.

In der 404.php können wir nun eine MySQL-Verbindung aufbauen und einen Select durchführen. Wird ein Ergebnis gefunden, leiten wir mit 301 den User weiter. Andernfalls bleiben wir einfach auf der 404-Seite und geben einen Fehler aus:

<?PHP
    mysql_connect("localhost","root","");
    mysql_select_db("demo_301");

    $sql="SELECT * "
          ."FROM pages "
          ."WHERE page SOUNDS LIKE '".mysql_real_escape_string($_SERVER['REQUEST_URI'])."' "
          ."LIMIT 1";
    $res=mysql_query($sql);
    if($row=mysql_fetch_assoc($res)){
        Header("HTTP/1.1 301 Moved Permanently");
        Header("Location: ".$row['page']);
    }
?>
Seite nicht gefunden!

Das wars auch schon. Nun leiten zum Beispiel folgende Urls an die Seite hallo-welt.html weiter:

  • /hello-welt.html
  • /hallowelt.html
  • /hallo-12lt.html
  • /h4ll0_w3lt.html

Das Script hat allerdings Probleme, wenn ich statt .html einfach .php mache. Dort sollte man vielleicht die Dateiendung herausnehmen.

Erweiterungsmöglichkeiten

Das Problem wäre gelöst, allerdings nicht dessen Ursache. Der gesetzte Link passt nicht. Deswegen wäre es denkbar, einen Log darüber zu führen. Inkl Referrer. Dort schaut man dann ab und an mal rein und setzt die Links anders.

Außerdem könnte man noch Regeln machen, wo man im Nachhinein eine Seite doch ganz wo anders hinleiten möchte. Das Auslesen hiervon müsste dann vor dem jetzigen Script laufen.

Beispiel herunterladen/span

Kommentare

Kevin Geller schrieb am 05.08.2012:

ich würde evtl vorher mal die url von dateitypen trennen so hast du am ende auch kein Problem damit.