404-Fehler – Redirect auf Sitemap in einem PHP-Webprojekt

In einem PHP-Webprojekt wollte ich, wenn ein Besucher eine in der Datenbank nicht vorhandene URL aufruft, statt der einfachen Meldung dass die Seite nicht existiert zusätzlich die Sitemap anzeigen. Die erste Idee war also in diesem Fall einfach auf die Sitemap-Seite umzuleiten und dort den zusätzlichen Text anzuzeigen.

 

Gewünschte Lösung

Um in PHP von einer aufgerufenen Seite auf eine andere umzuleiten reicht ein wenig Code:

Dabei muss man beachten, dass keine andere Ausgabe vor dem Senden des Headers stattfinden darf. Man darf also vor dem Senden des Headers keinen html-Code ausgegeben haben, ansonsten funktioniert die Umleitung nicht. Nun könnte man auf die Idee kommen, einfach diesen Header mit dem Verweis auf die Sitemap-Seite auszugeben. Allerdings müsste dabei aus irgendeiner Session-Variable oder dergleichen noch die Info kommen, dass der Info-Text, den ich anzeigen lassen wollte, zusätzlich angezeigt wird.

Anstatt sich aber weiter mit diesem Redirect zu beschäftigen, sollte man die ganze Herangehensweise, auch wenn sie einfach erscheint, sofort wieder vergessen. Warum? Ganz einfach: Es mag schön aussehen, wenn der Besucher auf die Seite namens „Sitemap“ oder „Inhalt“ umgeleitet wird, anstatt dass eine falsche URL in der Adresszeile stehen bleibt und die Sitemap angezeigt wird. Allerdings raubt es einem die Möglichkeit beim Aufruf dieser falschen URLs den 404-Statuscode auszugeben! Dieser ist aber wichtig, da auch nur dieser von Google und anderen Suchmaschinen korrekt ausgewertet wird, falls diese beim Crawlen auf ungültige URLs stoßen. Für dauerhaft umzuleitende URLs, beispielsweise im Falle einer Änderung der URL-Struktur, muss man ja sowieso 301-Redirects nutzen, damit diese von den Suchmaschinen als dauerhaft angesehen werden.

 

Richtige Lösung

Es ist nicht möglich zuerst den 404-Statuscode auszugeben und dann erst auf die entsprechende Seite umzuleiten. Hat man den Header einmal gesendet, dann ist dieser nicht mehr zu ändern. Deshalb ist es gar nicht möglich und auch gar nicht vorgesehen 404-Fehler in Verbindung mit einer Weiterleitung abzuwickeln. Deshalb muss man sich damit abfinden, dass bei einer fehlerhaft eingegebenen URL diese falsch in der Adresszeile stehen bleibt und man den 404-Statuscode mit PHP als Header sendet. Danach folgt dann der normale html-Code der Sitemap. Dies könnte beispielsweise so aussehen:

Im Vorfeld muss natürlich eine entsprechende Prüfung stattfinden, bei der sich herausgestellt hat, dass die URL nicht existiert.

 

Dass dies wohl standardmäßig so umgesetzt wird, kann man auch an dem 404-Handling von WordPress erkennen. Es bleibt die fehlerhafte URL in der Adresszeile stehen und es wird der 404-Text ausgegeben:

Diese Problematik wurde auch auf Stackoverflow durchgekaut:
http://stackoverflow.com/questions/6142244/php-header-location-404-php-true-404-does-not-work

Tobias Langner

Ich arbeite seit mehreren Jahren als IT-Administrator, bin ausgebildeter Fachinformatiker für Systemintegration und Studium-„Pausierer“ an der FernUni Hagen

Achtung: Für die Richtigkeit der zur Verfügung gestellten Informationen, Skripte, etc. übernehme ich keine Gewähr. Deren Nutzung geschieht ausdrücklich auf eigene Gefahr!

Schreibe einen Kommentar