404-Behandlung in Serendipity (2. Teil)
Ursprünglich war der folgende Beitrag bereits für den 11.06.2010 geplant, aber es hat sich leider ein wenig verzögert…
Ich greife das Thema nochmals auf, da mir der Kommentar von onli keine Ruhe gelassen hat
Da ich sowieso das S9Y-Plugin Statische Seiten (serendipity_event_staticpage) nutze, habe ich mir eine neue statische Seite mit dem Namen 404 (was sonst ) angelegt.
In der Datei .htaccess braucht man jetzt nur noch die relevante Zeile wie folgt abändern:
ErrorDocument 404 /index.php?serendipity[subpage]=404
Schon wird für ungültige Links das übliche Design inkl. aller Plugins/Suchfunktion/etc geladen und die vorher erstellte statische Seite angezeigt.
Und weil ich eh schon dabei war, habe ich mir noch das Template plugin_staticpage_related_category.tpl geschnappt, kopiert und allen unnützen Krempel entfernt, den man meines Erachtens auf einer festen Seite nicht benötigt.
Soweit war meine Theorie, allerdings scheiterte es an einem schlichten Problem: Wenn die 404-Statusseite aufgerufen wird, sendet Serendipity den HTTP-Statuscode 200, was dem besuchenden Programm mitteilt, dass die Seite existieren würde. Das ist insofern fatal, da Suchmaschinen sich an diesem Statuscode orientieren und die Seite bei 200 indexieren würde. Erhält die Suchmaschine dagegen den Code 404, wird die nicht existierende Adresse aus dem Such-Index gelöscht bzw. ignoriert.
Ab hier steigen wir dann mit der Ergänzung von heute ein
Heute gab es nun durch Garvin Hicking, einen der Programmierer hinter Serendipity, einen Lösungsansatz für mein Problem. Man braucht ein zusätzliches Event-Plugin, welches beim Aufruf einer bestimmten Seite den Status-Code ändert.
Meine endgültige Lösung, wie sie nach einigem hin und her mit Garvin nun funktioniert, sieht wie folgt aus und liegt unter /plugins/serendipity_event_404hook/serendipity_event_404hook.php
<?php
class serendipity_event_404hook extends serendipity_event {
function introspect(&$propbag) {
global $serendipity;
$propbag->add('name', '404 hook');
$propbag->add('description', '');
$propbag->add('requirements', array('serendipity' => '1.5', 'smarty' => '2.6.7', 'php' => '4.1.0'));
$propbag->add('version', '0.1');
$propbag->add('author', 'Garvin Hicking');
$propbag->add('event_hooks', array('entries_header' => true));
}
function event_hook($event, &$bag, &$eventData, $addData = null) {
global $serendipity;
if ($event == 'entries_header' && $GLOBALS['serendipity']['GET']['subpage'] == '404') {
serendipity_header('HTTP/1.0 404');
serendipity_header('Status: 404 Not Found');
}
return true;
}
}
Zu beachten ist natürlich, in Zeile 17 den richtigen Namen der Seite einzutragen, falls sie bei euch anders heißen sollte.
Schlussendlich funktioniert es also jetzt so, wie ich es mir von Anfang an gewünscht hatte.
Mein Dank geht daher nochmals ganz besonders an Garvin, der meine ständige Nachfragerei ausgehalten hat
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
SebiF am :
Schöner Beitrag, hat mir sehr geholfen.
In deinem Code fehlen übrigens in der Zeile “$event ‘entries_header’ && $GLOBALS[‘serendipity’][‘GET’][‘subpage’] ‘404’” zwei Gleichheitszeichen.
Viele Grüße, Sebi
Bernd am :
Danke für den Hinweis!
Da das statische-Seiten-Plugin inzwischen selbst über eine 404-Funktion verfügt, habe ich diese Variante aber gar nicht mehr am laufen, geht nun viel einfacher indem man einfach einen Haken setzt
Die Geschichte mit der .htaccess und der zusätzlichen Plugin fällt damit weg. Ein eigenes Template kann man sich dafür natürlich trotzdem basteln.