Nun ja, mit der robots.txt ist das so eine Sache. Das ist ja kein offizieller Standard sondern nur ein "de facto" Standard, an den sich halten kann wer will. Zudem haben noch einige große Unternehmen eigene Erweiterungen eingeführt, die nur von einigen wenigen beachtet werden.
Die offiziellsten Beschreibungen habe ich hier gefunden:
The Web Robots Pages
http://www.robotstxt.org/norobots-rfc.txt
und hier:
Performance, Implementation, and Design Notes
In keinem von denen steht, das der Datensatz mit user-agent: * als letzes in der robots.txt stehen muss. Im Gegenteil im ersten Dokument ist sogar ein Beispiel, wo der Datensatz mit diesem Feld als erstes kommt und später noch ein weiterer Datensatz mit einem spezifischen user-agent. Während in den ersten beiden Dokumenten im wesentlichen nur steht, das eine robots.txt aus einem oder mehreren Datensätzen mit jeweils einem oder mehreren user-agent Feldern gefolgt von einem oder mehreren Disallow Feldern, legt das dritte Dokument fest, dass in einem Datensatz nur genau ein user-agent Feld vorkommen darf, gefolgt von einem oder mehreren Disallow Feldern, und dass das Feld "user-agent: *" nur einmal in der robots.txt vorkommen darf.
Das erste Dokument ist noch sehr allgemein gehalten, während das 2 als Draft einer RFC schon recht konkrete Angaben macht, wie eine robots.txt zu interpretieren ist.
" These name tokens are used in User-agent lines in /robots.txt to
identify to which specific robots the record applies. The robot
must obey the first record in /robots.txt that contains a User-
Agent line whose value contains the name token of the robot as a
substring. The name comparisons are case-insensitive. If no such
record exists, it should obey the first record with a User-agent
line with a "*" value, if present. If no record satisfied either
condition, or no records are present at all, access is unlimited."
Wenn ich das richtig verstehe bedeutet das, dass ein robot die erste Anweisung in der robots.txt, die seinen Namen enthält, zu beachten hat, sollte diese nicht existieren, dann die erste Anweisung mit "user-agent: *". Wenn beides nicht zutrifft, ist das Durchsuchen der kompletten Seite erlaubt.
Das letzte Dokument, ist das einzige, was man als wirklich offiziell bezeichnen kann, die Spezifikation des HTML 4.01 Standard. Erwähnt wird die robots.txt leider nur im Anhang B Kapitel 4.1 und das ist sehr kurz gehalten und lässt einigen Spielraum für Interpretationen. Aber wie schon geschrieben, in keinem der erwähnten Dokumente (sowie allen anderen, die ich durchsucht habe) steht, dass der Datensatz mit "user-agent: *" als letztes in der robots.txt stehen muß.
Somit bleibt als einziges, was mir die Betreiber von Pixray und Co entgegnen könnten - sie halten sich an dass, was in der HTML 4.01 Spezifikation Anhang B festgelegt ist und da ich mehrere user-agents Felder hintereinander habe und erst dann die Disallow Anweisung kommt, können sie das ignorieren.
Um sicher zu gehen, habe ich meine robots.txt mit verschiedenen Tools, die im Web verfügbar sind getestet. Das Ergebnis war erschreckend, je nachdem welcher Philosophie die einzelnen Prüfprogramme folgen, habe sie entweder keinen Fehler oder mehrere Fehler oder kompletten Unsinn produziert.
z.B. New Robots.txt Syntax Checker: a validator for robots.txt files
Hat keinen Fehler gefunden und nur eine Warnung ausgegeben, dass ich doch den user-agent:* Datensatz als letztes haben sollte(wie du empfohlen hast), weil sonst einige ältere robots verwirrt werden könnten.
Der nächste Robots.txt Analysis - Check whether your site can be accessed by Robots (Google,Yahoo,MSN) bietet die Möglichkeit zu testen wie sich einige robots aus einer auswählbaren Liste beim Aufruf einer bestimmten URL verhalten würden. Hier kommt genau das heraus, was ich mir vorstelle, egal ob ich die user-agent:* Anweisung am Anfang oder am Ende der robots.txt habe.
Robots.txt syntax checker keine Fehler gefunden, egal ob user-agent: * am Anfang oder am Ende der robots.txt steht.
Robots.txt Checker führt einen Test einer URL gegen einen user-agent string durch (beides frei eingebbar). Der Test liefert genau die Ergebnisse, die ich erwarte, unabhängig davon, wo die user-agent:* Anweisung steht.
robots.txt Checker, Test Your Robot File Syntax will nach jeder Zeile mit einem user-agent eine Disallow Zeile, meldet also jede Menge Fehler.
Um nun allen gerecht zu werden, werde ich den user-agent: * Block ans Ende der robots.txt setzen und nach jeder user-agent Zeile eine Disallow Zeile einfügen.
Aber eigentlich wollte ich ja wissen, welche Erfahrungen ihr so mit den verschiedensten Crawlern, Bots, Spiders oder wie sie sich auch immer nennen mögen, gemacht habt.