www.fabiankeil.de/blog-surrogat/2006/02/15/1-0-fuer-defekten-googlebot.html

Apache-Konfiguration angepasst

1:0 für den defekten GoogleBot

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.

Kleinere Apache-Wunder

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.

Risiken und Nebenwirkungen

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.

Entdecke die Möglichkeiten

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.