www.fabiankeil.de/blog-surrogat/2006/02/15/1-0-fuer-defekten-googlebot.html
Eigentlich wollte ich den GoogleBot-Amoklauf ignorieren und warten bis Google das Problem selber löst. Diese Hoffnung habe ich nun aufgegeben und mich mal wieder mit der Apache-Konfiguration amüsiert, die ja zumindest ein Teil des Problems war.
Der erste und naheliegenste Versuch bestand aus einer Reihe von Zeilen wie:
RedirectPermanent /blog-surrogat///////// http://www.fabiankeil.de/blog-surrogat/
Wenn ich in jeder Reihe einen der hinteren Schrägstriche abziehen würde, müsste es mit möglichst wenig Umleitungen klappen. Dachte ich, lag aber falsch.
Auch bei Redirects hat der Apache die sonderbare Eigenschaft, mehrere Schrägstriche wie einen einzigen zu betrachten. Obige Redirect-Anweisung leitet zwar einen Großteil von GoogleBots Fantasie-Anfragen korrekt um:
fk@TP51 ~ $lynx -head -dump http://www.fabiankeil.de/blog-surrogat//////2005/ HTTP/1.1 301 Moved Permanently Date: Tue, 14 Feb 2006 18:18:38 GMT Server: Apache/df-exts 1.2 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d AuthPG/1.3 Location: http://www.fabiankeil.de/blog-surrogat/2005/ Connection: close Content-Type: text/html; charset=iso-8859-1
Erfasst aber auch die korrekte Anfrage nach http://www.fabiankeil.de/blog-surrogat/2005/
,
die auf sich selbst umgeleitet wird. Es entsteht eine Schleife bis der Browser
oder sein Benutzer die Lust verliert. Der gewünschte Inhalt wird nie ausgeliefert.
Auf der Apache-Mailingliste httpd-users wurde von Krist van Besien:
RewriteRule (^.*)/{2,}(.*$) $1/$2 [R,L]
als ungetesteter Denkansatz angeboten, was mich der Lösung schonmal deutlich näher brachte.
Der Asterisk scheint bei meiner Apache-Konfiguration jedoch gierig zu sein, obwohl das bei Versionen unter 2.0 noch nicht der Fall sein sollte.
Bei der Abfrage von /blog-surrogat/////
verschwanden nur zwei Schrägstriche:
genau die von /{2,}
benötigte Mindestmenge, um nicht den ganzen regulären Ausdruck
scheitern zu lassen. Der Rest der Schrägstriche wird offensichtlich von (^.*)
mit abgedeckt
und somit auch nicht entfernt.
Die Apache-Versionen mit gierigem Asterisk sollen Perl-kompatible Ausdrücke verstehen,
mit dem Anhängen eines Fragezeichens müsste man also von gierig auf nicht gierig umschalten können.
Domainfactorys Apache/df-exts 1.2 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d AuthPG/1.3
entlockt
man damit leider nur einen globalen Server-Fehler.
Als weiterer Nachteil der RewriteRule
wurde bei manchen Abfragen
die Zeichenkette kunden/fabiankeil.de/webseiten
in die Mitte der
Location
gematscht. Vermutlich ein Feature der df-exts
(Domainfactory-Extensions?), denen ich auch die halbgare Unterstützung der
Perl-kompatiblen Ausdrücke zu verdanken haben werde.
Der nächste Versuch war:
RewriteRule ^([^/]*)/{2,}(.*$) http://www.fabiankeil.de/$1/$2 [R=Permanent,L]
Durch das Voranstellen der Domain wird kein kunden/fabiankeil.de/webseiten
mehr ergänzt. Mir leuchtet der Zusammenhang nicht ein, aber ich werde es einfach mal hinnehmen.
Wie zu erwarten werden damit nur mehrfache Schrägstriche in der ersten Ebene erfasst, für den GoogleBot ausreichend, aber noch nicht optimal. Erneut von Krist kam der Tipp, daraus:
RewriteRule ^(.*[^/])/{2,}(.*$) http://www.fabiankeil.de/$1/$2 [R=Permanent,L]
zu machen, damit wird auch späteres Auftreten von mehrfachen Schrägstrichen behandelt.
fk@TP51 ~ $lynx -head -dump http://www.fabiankeil.de/blog-surrogat///2005// HTTP/1.1 301 Moved Permanently Date: Thu, 16 Feb 2006 14:22:58 GMT Server: Apache/df-exts 1.2 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d AuthPG/1.3 Location: http://www.fabiankeil.de/blog-surrogat///2005/ Connection: close Content-Type: text/html; charset=iso-8859-1 fk@TP51 ~ $lynx -head -dump http://www.fabiankeil.de/blog-surrogat///2005/ HTTP/1.1 301 Moved Permanently Date: Thu, 16 Feb 2006 14:23:26 GMT Server: Apache/df-exts 1.2 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d AuthPG/1.3 Location: http://www.fabiankeil.de/blog-surrogat/2005/ Connection: close Content-Type: text/html; charset=iso-8859-1
Für jede Schrägstrich-Anhäufung gibt es einen eigenen Redirect. Nicht effizient, aber auch nicht weiter tragisch, da der GoogleBot noch nicht kaputt genug ist. Bis jetzt gab es maximal eine Schrägstrichhäufung pro Abfrage.
Wenn ich die
Apache-Dokumentation
richtig verstehe, kann man sogar externe Skripte zur Pfad-Generierung nutzen. Mit der Ergänzung von
etwas wie s@//+@/@g
im angebotenen Beispiel-Perlskript müsste man das Problem also auch
mit nur einer Umleitung erledigen können. Für meine Zwecke scheint mir das jedoch etwas übertrieben,
abgesehen davon darf ich gar keine Skripte ausführen.
Die meisten GoogleBot-Abfragen sollten nun umgeleitet werden. Anforderungen von
/%3Cbr%3E%3Cp%3E%3E%3C%3C
werden weiterhin mit 404
beantwortet,
das ist mir zum einen egal, zum anderen wüsste ich nicht wohin ich umleiten sollte.