Sören Kuklau: Browser-Identifikation auch bei Opera - ABER WIE ???

Beitrag lesen

Erstmal: Wozu muss der Browser identifiziert werden? Es ist in 90% der Fälle nicht sinnvoll, die Angabe "User-Agent" auszuwerten, denn die hat viel zuviele Varianten, die gar nicht alle abzudecken sind.

Außer der Variante "ich verkaufe den Macher einer Seite für dumm und behaupte, mein Browser sei XY" wüsste ich jetzt keine.

Würden alle Browser mit den W3C-Normen perfekt klar kommen, würde diese Problematik für mich nicht existieren. Fakt ist aber, dass selbst Gecko unter anderem CSS2 noch nicht vollständig implementiert hat, von XHTML1.1 Ruby noch nicht kann, von HTML 2.0 <link> in neueren Builds aus Performance-Gründen nicht sinnvoll auswertet, uswusf. Ganz zu schweigen von IE, der noch nicht mal ansatzweise an diese Qualität herankommt.

Eine umfangreichere Site mit komplexen Layout (so etwas wird mir nunmal vorgegeben) kann ich daher nur realisieren, wenn ich den UA-String auswerte. Server-seitig, über Perl oder PHP; nicht client-seitig mittels JavaScript.

Was Sinn macht, ist die Auswertung, ob der Browser document.getElementById (alle neuen), document.all (IE4) oder document.layers (NS4) kennt - sofern man diese Methoden in seinem Skript verwenden will.

Leider nein. Abgesehen davon, dass derartiges server-seitig nicht auswertbar ist (was nötig ist, um jede menge Traffic zu sparen - oder soll ich z.B. Stylesheets übertragen, aber die letztlich nicht vom Browser benutzen lassen?), ist diese Methode allmählich auch veraltet, denn

  • Opera kann inzwischen leider teilweise document.all
  • bei Mozilla bahnt sich leider, leider eine document.all-Implementation an, und evtl. auch eine document.layers-Implementation. Natürlich versuchen viele, das zu verhindern.
  • afaik kann auch Konqueror teilweise document.all
  • mit "alle neuen" weisst du nicht, ob es IE 5 oder IE 6 ist. Ersterer hat bekanntlich große box-model-Macken.

Wer seinen UA-String abfälscht, ist letztlich selbst schuld: trifft man auf eine Site, die kategorisch nach UA-String den Browser, den man benutzt, aussperrt, so sollte man diese nach Möglichkeit demonstrativ links liegen lassen. Ist das nicht möglich, so kann man von mir aus für diese Site den UA-String kurzzeitig umstellen, sollte das aber keineswegs dauerhaft tun.

Ferner gibt es solche, die das aus Spaß machen, mit UA-Strings wie "Kitchen/1.0 (modern)" etc. - damit ist der Sinn des Headers ad absudrum geführt, und da gilt wirklich "selbst schuld".

Wenn es dich interessieren sollte, so sieht mein PHP-Code dafür aus:

//-------------------------------------------
        // query UA string
        //-------------------------------------------

/**
        * $detectedUA will contain one of the following values:
        * 'opera6' : Opera 6
        * 'operaold' : Opera old version
        * 'ie5mac' : IE 5 Mac
        * 'ieoldmac' : IE Mac old version
        * 'ie6win' : IE 6 Win32
        * 'ie5win' : IE 5 Win32
        * 'ieoldwin' : IE Win32 old version
        * 'gecko' : any Gecko browser
        * 'other' : other UA string
        */

function inUAString($UAString) {
            global $HTTP_USER_AGENT;
            $notUAString = strpos($HTTP_USER_AGENT,$UAString) === false;
            return !$notUAString;
        }

function detectUA() {
            if ( inUAString('Opera') )
                $detectedUA = inUAString('6.0') ? 'opera6' : 'operaold';
            elseif ( inUAString('MSIE') ) {
                if ( inUAString('Mac') )
                    $detectedUA = inUAString('MSIE 5') ? 'ie5mac' : 'ieoldmac';
                elseif ( inUAString('Win') ) {
                    if ( inUAString('MSIE 6') )
                        $detectedUA = 'ie6win';
                    elseif ( inUAString('MSIE 5') )
                        $detectedUA = 'ie5win';
                    else $detectedUA = 'ieoldwin';
                }
            }
            elseif ( inUAString('Gecko') )
            $detectedUA = 'gecko';
            else $detectedUA = 'other'; // triggered by konqueror, ns4 and others
            return $detectedUA;
        }

Ich selbst bin kein PHP-Experte, und es mag effizienter gehen.