Seltsames Browsererkennungsproblem
$xNeTworKx
- perl
Hola,
Ich versuche zwischen Mozilla, IE, Opera und Konqueror zu unterscheiden. Das klappt auch sehr gut, aber ich lies Konqueror von einem Freund testen, da ich kein Linux habe und obwohl der USER_AGENT von Konqueror dies anzeigte:
Mozilla/5.0 (compatible; Konqueror/3.1; Linux)
leitete ihn das folgende Script auf Mozilla.html weiter. Wie kann so etwas sein?
#!/usr/bin/perl -w
use strict;
use CGI;
my $query = new CGI;
if ($ENV{'HTTP_USER_AGENT'} =~ /Gecko/i) {
print $query->redirect('mozilla.html');
}
if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/i) {
print $query->redirect('ie.html');
}
if ($ENV{'HTTP_USER_AGENT'} =~ /Opera/i) {
print $query->redirect('opera.html');
}
if ($ENV{'HTTP_USER_AGENT'} =~ /Konqueror/i) {
print $query->redirect('konqueror.html');
} else {
print $query->redirect('blank.html');
}
Zum selbst ausprobieren: http://acid4usignatur.acid4u.com/
$xNeTworKx.
Hi $xNeTworKx,
Ich versuche zwischen Mozilla, IE, Opera und Konqueror zu unterscheiden. Das klappt auch sehr gut, aber ich lies Konqueror von einem Freund testen, da ich kein Linux habe und obwohl der USER_AGENT von Konqueror dies anzeigte:
Mozilla/5.0 (compatible; Konqueror/3.1; Linux)
leitete ihn das folgende Script auf Mozilla.html weiter. Wie kann so etwas sein?
Scheint so, als ob der als UserAgent übermittelte String nicht dem entspricht, was standardmäßig beim Konqueror übermittelt wird. Wie sieht denn der UA speziell deines Freundes aus? Darüber hinaus ist der UA denkbar ungeeignet für eine Browserweiche, aber das Thema wurde ja schon des öfteren im Forum diskutiert.
Ach so, einen Tipp zum Lesen noch: http://www.psychedelix.com/agents.html
Viele Grüße
Torsten
Hola,
Scheint so, als ob der als UserAgent übermittelte String nicht dem entspricht, was standardmäßig beim Konqueror übermittelt wird. Wie sieht denn der UA speziell deines Freundes aus?
Eben genauso: Mozilla/5.0 (compatible; Konqueror/3.1; Linux)
Das ist es ja, was ich nicht verstehe, da ich ja nach dieser Angabe gehe, wohin umgeleitet wird, und darin kommt eben das Wort Konqueror vor? Ich habe ihn zuerst auf ein Script gehen lassen, das mir nur den UA ausgibt, und dieser hat mir eben das oben genannte ausgespuckt.
Darüber hinaus ist der UA denkbar ungeeignet für eine Browserweiche, aber das Thema wurde ja schon des öfteren im Forum diskutiert.
Ich weiß, aber ich glaube es gibt keine 100%ig richtige Lösung dafür und mit Javascript wollte ich gar nicht anfangen, nach document.all usw abzufragen. Ich glaube, da kommt dann noch mehr durcheinander hinaus.
Ach so, einen Tipp zum Lesen noch: http://www.psychedelix.com/agents.html
thx.
$xNeTworKx.
Moin!
Darüber hinaus ist der UA denkbar ungeeignet für eine Browserweiche, aber das Thema wurde ja schon des öfteren im Forum diskutiert.
Ich weiß, aber ich glaube es gibt keine 100%ig richtige Lösung dafür und mit Javascript wollte ich gar nicht anfangen, nach document.all usw abzufragen. Ich glaube, da kommt dann noch mehr durcheinander hinaus.
Doch, genau das ist die einzig sinnvolle Methode, um Browserunterscheidungen durchzuführen.
Oder welchen Sinn hat deine Browserabfrage? Warum muß unterschieden werden? Ich habe bislang keinen Fall gesehen, wo zwingend auf dem Server der (sehr unzuverlässige) User-Agent-String ausgewertet werden _muß_. Alle Probleme ließen sich mit passendem HTML und CSS lösen, und Javascript-mäßige Dynamik durch die Abfrage von document.all/layers/getElementById.
- Sven Rautenberg
Hola,
wobei wir wieder bei dem Problem wären, ob Javascritp eingeschaltet ist oder nicht. Jetzt ist nun die Frage: Haben mehr Leute einen falschen UA oder Javascript deaktiviert?
$xNeTworKx.
Moin!
Hola,
wobei wir wieder bei dem Problem wären, ob Javascritp eingeschaltet ist oder nicht. Jetzt ist nun die Frage: Haben mehr Leute einen falschen UA oder Javascript deaktiviert?
Klar, aber die Probleme sind dann andere. Es ist (mehr oder weniger problemlos) möglich, für alle aktuellen Browser nur mit HTML und CSS einigermaßen gleich aussehende Webseiten zu erstellen, zu deren Darstellung keinerlei Javascript notwendig ist. Auch der dumme IE-BoxModel-Bug ist damit austricksbar.
Was das Eingeschaltetsein von Javascript angeht: Da mußt du ja ohnehin irgendeine Alternative finden, falls es ausgeschaltet ist.
Es ist ja (siehe Link von ThorstenA zu einer unvollständigen Auflistung existierender User-Agent-Strings) praktisch unmöglich, jeden einzelnen User-Agent explizit zu erfassen und mit einer individuellen Version zu versorgen. Das wäre auch für dich absolut zuviel Aufwand.
Also gruppierst du anhand von gewissen Merkmalen im UA-String, weil sich beispielsweise alle "Opera"-enthaltenden Browser wahrscheinlich als Opera-Browser erweisen werden. Was ist aber mit "Mozilla"-enthaltenden Browsern? Das sind nahezu alle existierenden Browsern (weil die alle "compatible" sind). Vielleicht mit Ausnahme von "echten Operas".
Und was ist mit einer auch sehr wichtigen Gruppe von User-Agents, den Suchmaschinen? Die geben sich meist eindeutig als Suchmaschine aus. Sowas muß berücksichtigt werden. Welche Version kriegt die Suchmaschine zu sehen?
Und was ist, wenn die Suchmaschine durch einen zweiten Request mit einem Browser-UA prüft, ob du ihr nicht irgendwas speziell vorsetzt, damit sie viele Suchworte findet, der normale Besucher aber irgendwelche anderen Angebote kriegt? Kann ja sein, dass eine Suchmaschine eine Abweichung zwischen Browser- und Suchmaschinenseite mit Minuspunkten bestraft. Immerhin stoppt man damit vermutlich einige Suchmaschinenspammer.
Du kämpfst also im Prinzip einerseits damit, irgendwelche angeblich zuverlässigen Merkmale in den User-Agent-Strings zu finden, um einen Browser zu identifizieren, und andererseits mußt du einen identifizierten Browser dann mit einer angepaßten Version versorgen.
Da sich die Browser aber eben gottlob meist an den vom W3C gesetzten Standard halten, sind, was CSS angeht, im Prinzip nur zwei, bestenfalls drei Versionen notwendig, und Javascriptmäßig gilt dasselbe. Die Versionen sind: W3C-DOM, IE, und NS4.
Nichts ist peinlicher, als mit der serverseitigen Browsererkennung falschzuliegen. Mir ist das mittlerweile schon bei zwei CMS-Systemen untergekommen, die heftig am UA-String rumraten. Wenn man daran nichts manipuliert, dann funktioniert das. Aber wenn der String verändert wird - und festzuhalten ist, dass immer häufiger genau damit gerechnet werden muß, weil Tools wie beispielsweise Webwasher immer beliebter werden - dann funktioniert insbesondere das Javascript nicht, weil die für den Browser unpassende Version ausgeliefert wird, die nicht mehr selbst testet, ob sie im richtigen Browser läuft.
Klar: Man kann da ganz supertolle Sachen machen mit so einer Browsererkennung, indem man beispielsweise Bugs in Browsern dadurch umgeht, indem man ganz individuell auf die Sub-Sub-Version des Browsers angepaßte Javascripte ausliefert, die ultragenau angepaßt sind.
Ich kann mir aber kaum vorstellen, dass du als Einzelperson die Mittel und die Zeit hast, deine Seite auf hundert Browserversionen anzupassen. Allein der IE, ein ja anerkanntermaßen weit verbreiteter Browser, hat ja schon unzählige Versionen. 5.0, 5.5, 6.0 - aber das ist ja nur die grobe Einteilung. Genauer hingeschaut gibt es vom 6.0 beispielsweise 6.0, 6.0 SP1 und 6.0 SP2 (wenn ich richtig informiert bin). Ganz zu schweigen von den Vorgängerversionen. Und dann erst Netscape 4...
Aus diesem Grunde halte ich es für absolut wahnsinnig (selbst wenn man die Ressourcen für individuelle Anpassung hätte), serverseitige Browsererkennung zu betreiben und auch nur den Gedanken zu hegen, dadurch würde irgendetwas leichter. Das Gegenteil ist der Fall. Denn man muß ja trotzdem über alle berücksichtigten Browser komplett Bescheid wissen, um ihre Macken zu kennen und umgehen zu können.
Da ist mir eine einzige Version, die mit einzelnen Browserexemplaren getestet wurde und sich vermutlich aufgrund ihrer Struktur auch in allen anderen Browserversionen identisch verhält (insbesondere auch in zukünftigen Browsern!), wesentlich lieber.
Denn serverseitige Browsererkennung muß fortlaufend gepflegt werden. Ansonsten könnte es passieren, dass eine neue Browserversion plötzlich einen Bug nicht mehr enthält, und deshalb gesondert berücksichtigt werden muß. Und für sowas gibt es reichlich Beispiele aus der Vergangenheit.
Als Beispiele:
IE 5.5 -> IE 6: Der Box-Model-Bug ist behoben, wenn man den richtigen Doctype angibt.
Opera 6 -> Opera 7: Kompletter Rewrite, insbesondere sind plötzlich wesentlich mehr DOM-Möglichkeiten für DHTML vorhanden.
- Sven Rautenberg