Randshop - Lösung: Error 404 Seite mit korrektem HTTP Header anzeigen

Aktuelle Situation und das Problem

In der Shopsoftware randshop wird eine spezielle Fehlerseite angezeigt, wenn eine Seite des Shops nicht gefunden werden kann.

Üblicherweise senden solche Seiten einen "Error 404 not found" HTTP-Header um dem Empfänger (Browser) zu signalisieren dass die gewünschte Seite nicht gefunden werden konnte.

Dieser Header wird normalerweise vom Webserver erzeugt. Bei CMS oder Shopsystemen wie dem randshop, die sprechende Urls erzeugen, wird jedoch nur ein Datenbankeintrag nicht gefunden. In diesem Fall wird dann per PHP ein "Error 404 not found" Http-header gesendet werden. Mittels PHP kann dann sogar eine eigene Webseite angezeigt werden.

Im randshop funktioniert das jedoch standardmäßig so, dass zuerst auf eine Fehlerseite weitergeleitet wird und diese dann den Error 404 Header sendet. Der Browser (oder die Suchmaschine!) erhält also zuerst eine Error 302 "Moved Temporarily" Meldung und erst danach die Error 404. Wie weit dies Suchmaschinen tatsächlich verwirrt, weiß ich nicht. Klarer wäre aber sicher, nur den Error 404 zu senden, dann gäbs gleich gar keine Mißverständnisse.

Ein weiterer Punkt ist, dass bei der Weiterleitung auch die Anzeige des Url im Browser geändert wird. Der Benutzer kann also nicht mehr sehen, was er eingegeben hat. Könnte ja ein Buchstabendreher oder Vertipper sein.

Betroffen davon sind übrigens alle randshop-Versionen die die sprechenden Urls erstellen können. Also seit der 1.5 bis einschließlich der aktuellen Version 2.3.

Die Lösung ist recht einfach selbst zu machen

Die Datei bootstrap.php ist für die Erstellung der sprechenden Urls im randshop die wichtige Anlaufstelle. Per .htaccess werden alle Seitenaufrufe dorthin "umgeleitet", ohne dass es im Browser sichtbar ist.

Darin kommt ziemlich am Ende diese Zeile zweimal vor:

header('Location: ' . URLPFAD . 'themes/error/error_404.php');

beide Zeilen werden durch jeweils diesen Code ersetzt:

$SEOCall = true;
include_once(DATEIPFAD . 'themes/error/error_404.php');

Damit wird nun der Code der Fehlerseite im Fehlerfall gleich direkt angezeigt. Da die Fehlerseite selbst den Error 404 sendet und sich der Url im Browser nicht mehr ändert ist jetzt Suchmaschine und Benutzer bestens bedient.

 

Kleine Feinarbeit um unnötige Warnings zu vermeiden

Dadurch, dass der relative Pfad zur config.inc.php in der /themes/error/error_404.php jetzt nicht mehr passt, werden bei eingeschalteten Fehlermeldung entsprechende Warnings angezeigt.

Dies lässt sich dadurch beheben, dass in der /themes/error/error_404.php diese beiden Zeilen

include_once("../../conf/config.inc.php");
include_once(DATEIPFAD . "conf/db.inc.php");

durch diesen Code ersetzt werden:

if (!$SEOCall) {
    include_once("../../conf/config.inc.php");
    include_once(DATEIPFAD . "conf/db.inc.php");
}

Damit wird die config.inc.php und die db.inc.php nur noch per include_once eingebunden, wenn die Seite direkt aufgerufen wird.
Wird die Fehlerseite durch den include in der bootstrap.php eingebunden werden diese beiden Dateien schon dort includet.

 

Wie immer würde ich mich über Kommentare zu diesem Artikel sehr freuen. Könnte ja sein, dass Sie noch Ideen und Anregungen zur Verbesserung haben :-)

Kommentar abgeben: