Sven Rautenberg: Seite nicht auffindbar - Was tun?

Beitrag lesen

Moin!

oh Missverständnis.

Ich verwenden
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://example.com');

Ich wollte nur wissen, warum dies nicht bei einem 404 geht.

Ich habe mal einen kurzen Blick in die HTTP-RFC geworfen.

Nirgendwo steht, dass der Location-Header nicht mit Status 404 kombiniert werden kann oder das sogar explizit verboten ist.

Allerdings läßt PHP allen der header()-Funktion übergebenen Strings noch eine Nachbehandlung angedeihen!

Im Detail:
1. Mehrfache Aufrufe von header() für denselben Header überschreiben sich gegenseitig (wenn man nicht explizit angibt, dass der Header zusätzlich sein soll, siehe den zweiten Parameter) - das gilt für alle Header-Strings.

2. Ein Header beginnend mit "HTTP/..." wird, egal welche Reihenfolge von Headern gesendet wurde, immer an den Anfang der Header gestellt.

3. Ein Location-Header sorgt immer dafür, dass gleichzeitig ein 302-Status gesendet wird, es sei denn, es wurde schon ein anderer 3xx-Status gesetzt.

Soweit die Theorie. Ich habe es dann mal kurz programmiert.

Erste Version:

<?php  
header("HTTP/1.1 404 not found");  
header("Location: http://www.example.com/");  
echo "404 not found";  
?>  

Resultat: wget -S http://www.example.org/test.php

HTTP request sent, awaiting response...
  HTTP/1.1 302 Found
  Date: Thu, 28 Aug 2008 15:26:58 GMT
  Server: Apache
  X-Powered-By: PHP/5.2.6-pl2-gentoo
  Location: http://www.example.com/
  Content-Length: 13
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Content-Type: text/html
Location: http://www.example.com/ [following]

wget zeigt also, dass vom Status 404 nichts übrig geblieben ist, stattdessen wird dem Redirect gefolgt.

Vertauscht man jetzt die beiden Headerzeilen, passiert sowas:

<?php  
header("Location: http://www.rautenberg.privat/");  
header("HTTP/1.1 404 not found");  
echo "404 not found";  
?>

HTTP request sent, awaiting response...
  HTTP/1.1 404 not found
  Date: Thu, 28 Aug 2008 15:30:11 GMT
  Server: Apache
  X-Powered-By: PHP/5.2.6-pl2-gentoo
  Location: http://www.example.com/
  Content-Length: 13
  Keep-Alive: timeout=15, max=100
  Connection: Keep-Alive
  Content-Type: text/html
  X-Pad: avoid browser bug
2008-08-28 17:30:11 ERROR 404: not found.

Die Location-Zeile ist zwar im Header drin, wget folgt dem Redirect aber NICHT. Auch mein Opera 9.50 und mein Firefox 3 verhalten sich genauso: Es wird einfach nur der per echo ausgegebene Text angezeigt, keinem Redirect gefolgt.

Selbst wenn also theoretisch ein 404 mit integriertem Redirect per Location-Header erlaubt wäre, so ist doch davon auszugehen, dass nahezu 100% aller derzeit existierenden HTTP-Clients dem Redirect nicht folgen werden - sowohl Browser, als auch Suchmaschinenspider.

Und es entbehrt auch nicht einer gewissen Logik, dass diese Kombination aus 404 und Redirect wegen innerer Unsinnigkeit nie wie von dir gewünscht ausgewertet werden wird.

Aber ich kann ja 404 ausgeben und dann einfach eine Fehlerseite erreichbar machen. Zählt dies dann eigentlich nicht als doppelter Content, die Fehlerseite faktisch unendlich oft zur Verfügung zu stellen?

Nun mach dir man erstmal nicht ins Hemd wegen "duplicate content". Suchmaschinen sind nicht komplett blöd, sowohl was die Negativbewertung von Spammern angeht, als auch was die Positiv-Wertung eines legitimen Content-Angebots angeht.

Welcher Information würdest du mehr Authentizität zugestehen: Wenn von irgendeiner Webseite irgendein Link auf deine Seite geht, dort eine nichtexistierende Seite referenziert, diese aber kein 404 ergibt, sondern z.B. eine Sitemap oder die Startseite mit Status 200, oder einen Redirect auf diese Seiten - und innerhalb deiner gesamten Sitenavigation taucht nirgendwo ein Link auf eben diese nichtexistente Seite auf - wer hat dann das bessere Wissen über nichtexistente Seiten, du oder diese andere Seite? Und wie würdest du als Suchmaschinenprogrammierer dann den Inhalt dieser nichtexistenten Seite einschätzen?

Suchmaschinen testen nämlich durchaus auch das Serververhalten bei Requests auf nicht existierende Ressourcen. Viele Server sind nämlich so programmiert, dass sie (dummerweise) gar keinen Status 404 rausrücken, sondern irgendwie immer mit einer Standardantwort ankommen. Durch den Test können die Spider dann unterscheiden, ob die Seite tatsächlich existiert, oder doch eher als 404 einzuschätzen ist.

Und sollte eine Suchmaschine wirklich den Content einer echten 404-Seite als "dupliziert" einstufen, würde das ja bedeuten, dass die Maschine die 404-Seite tatsächlich indizieren wollen würde - und das wäre nun wirklich idiotisches Verhalten. Es ist Standardzustand, dass es pro Server nur eine einzige 404-Seite gibt, und dass alle nichtexistenten URLs als "Inhalt" diese Standardseite haben.

- Sven Rautenberg

--
"Love your nation - respect the others."