Die Tücken der Redirects
Oder: Wie man sich mit dem Google-Cache 404er einhandeln kann
Folgendermaßen schafft man es, dass Google nicht existierende URLs auf der eigenen Website sucht: Ein PHP-Skript sollte zählen, wie oft ein bestimmter Link angeklickt wurde. Daher wurde die Ziel-URL nicht direkt verlinkt, sondern über ein Skript geleitet, das den Klick verbucht und dann einen 302 ("Das Objekt ist nicht hier sondern dort") schickt.
// ohne weiteren Zusatz schickt dies in PHP einen Statuscode 302
header ('Location: http://www.example.com/');
Ergebnis: In den Google-Suchergebnissen taucht der Inhalt der fremden Site mit der URL des eigenen Skripts auf.
Problem Nummer 1: Das könnte dem Eigentümer der fremden Site nicht gefallen. Und nach der aktuellen Rechtsprechung (Stichworte: "fremde Seite zu eigen machen") hätte er auch gute Chancen, sich damit vor Gericht durchzusetzen und evtl. gar Schadenersatz o.ä. einzuklagen.
Problem Nummer 2: Wenn nun jemand dieses Suchergebnis aus dem Google-Cache abruft, stellt Google nur die eigentliche HTML-Seite zur Verfügung, versucht aber, Bilder u.ä. von der eigenen Site zu laden - wo diese natürlich niemals existiert haben. Nicht lange danach wird dann auch der Googlebot anfangen, diese Dateien bei uns zu suchen. Und wie wir schon wissen, lässt er sich davon dann auch mit einem 404 nicht abbringen.
Für diesen Fall gibt es verschiedene Lösungsansätze (mein Dank geht an die Leser der Newsgruppe de.comm.infosystems.suchmaschinen für die Anregungen aus der Diskussion):
Grundsätzlich sollte man überlegen, solche Skripte den Robots erst gar nicht zugänglich zu machen. Mit anderen Worten: Man kann eine robots.txt anlegen und dort das Zählskript ausschliessen. Schliesslich will man ja im Normalfall die Anzahl der Menschen wissen, die auf den Link geklickt haben und nicht, wie oft der Googlebot über diesen Link ging.
# liebe Robots, dieses Skript bitte nicht in den Index aufnehmen
Disallow: /linkcounter.php
Ferner kann man einen Statuscode 301 statt des 302 schicken. Von der Intention her erscheint 302 zunächst als der "logischere" Code - die angeforderte Ressource (eben die Zielseite) befindet sich nun einmal nicht "hier" sondern woanders. Gleichzeitig deutet 302 aber auch an, dass sich die Ziel-URL einmal ändern könnte - und so macht die Entscheidung von Google, den bekannten Fixpunkt (nämlich unsere URL) beizubehalten, plötzlich wieder Sinn.
Leider passt aber auch der Statuscode 301 nicht so wirklich. Die Intention bei diesem Code ist: "Ja, die Ressource war einmal hier, ist nun aber dort". Der erste Teil dieser Aussage ist eine glatte Lüge - es gab "hier" (bei uns) nie eine solche Ressource. Hier muss man jedoch einfach nach dem Motto "der Zweck heiligt die Mittel" verfahren. Da Google nun den Endpunkt unserer Umleitung als den Fixpunkt betrachtet nimmt er nun auch diese, also die Ziel-URL, in den Index auf - und das ist ja genau das, was wir wollen.
; schickt einen Statuscode 301
Redirect permanent http://www.example.com/
// PHP-Lösung:
header ('HTTP/1.1 301 Moved');
header ('Location: http://www.example.com/');
Ein Nachteil von 301 für unsere o.g. Anwendung (Klicks zählen) ist allerdings, dass die Ziel-URL gecached werden darf. Bei Zugriffen, die von verschiedenen Rechner über den gleichen Proxy kommen, würde unser Zählskript also möglicherweise nicht alle Klicks mitbekommen. Der Statuscode 302 dagegen darf nicht gecached werden (was auch vollkommen logisch ist, wenn man jeweils die Intention der beiden Statuscodes berücksichtigt).
Es gäbe noch einen dritten Statuscode, den man senden könnte: 303 "See other". Experimente haben jedoch gezeigt, dass Google diesen genauso wie 302 behandelt. Allerdings wurde dieser Statuscode auch vor allem dazu eingeführt, um einen Wechsel der Request-Methode (z.B. von POST zu GET) zu signalisieren und passt daher für unseren Fall ohnehin nicht so recht. Zudem besteht die (vage) Möglichkeit, dass sehr alte User Agents (die nur HTTP/1.0 implementieren) diesen Statuscode nicht verstehen.
Übrigens behandelt Google auch einen Redirect per Meta-Refresh wie einen 302 - mit den gleichen Konsequenzen wie oben geschildert.
<!-- Pseudo-Umleitung via HTML -->
<meta http-equiv="refresh" content="0; URL=http://www.example.com/">
Links
|