Sven Rautenberg: serverseitige Browserunterscheidung

Beitrag lesen

Moin!

Das selbe hab ich vor ein paar Wochen auch machen wollen. Hier ein php. Tu das in ein php file mit dem namen redirect.php:

WENN du schon fertigen Code posten mußt, dann poste doch in Gottes Namen wenigstens _VERNÜNFTIGEN CODE!!!1_

Dir sind im Grunde genommen drei Dinge anzukreiden (und zwar heftigst):

1. Du arbeitest mit globalen Variablen innerhalb von Funktionen.
2. Du benutzt Variablen, die nur aufgrund von register_globals=on existieren.
3. Du kapselst deinen Code nicht in einer Funktion.
4. Du zwingst dir ewig die Notwendigkeit zu ständigen Updates deines Codes auf (was aber mit dem prinzipiellen Konzept serverseitiger Browsererkennung zusammenhängt).

Im Einzelnen:

global $HTTP_USER_AGENT, $thestring, $place;

Würg! Siehe 2.: $HTTP_USER_AGENT existiert nicht, wenn register_globals auf off stehen. Und das ist bei immer mehr PHP-Installationen der Fall (seit Version 4.2 ist es Standard).

Siehe 1.:Außerdem greifst du auf globale Variablen zurück, deren  Namen folgerichtig von anderen Skriptteilen dann nicht mehr für andere Zwecke verwendet werden dürfen.

if (inAgent('konqueror')){

....

}
else $browser = 'unknown browser';

Das gehört in eine Funktion.

if (!isset($version))
    $version = substr($HTTP_USER_AGENT, $place + strlen($thestring), 4);
$version = ereg_replace('[^.0-9]', '', $version);
if (!isset($os)){
    if (inAgent('linux')) $os = 'Linux';
    elseif (inAgent('x11')) $os = 'Unix';
    elseif (inAgent('mac')) $os = 'Mac';
    elseif (inAgent('win')) $os = 'Windows';
    else $os = 'unknown system';
}

Das auch. Gerne auch beides zusammen in eine Gesamtfunktion. Oder noch besser in eine Klasse.

Außerdem triffst du in deinem Code interessante Annahmen. Wer sagt dir beispielsweise, dass der Konqueror immer unter Linux läuft? Wer sagt dir, dass in Unix-Browserstrings immer "x11" vorkommt? Wer sagt dir, an welcher Stelle des Strings die Versionsnummer steht?

<?php include 'redirect.php'; ?>
<?php
if ($browser == 'Internet Explorer' and $version > '5.5') {
    Header ("Location: iex/");}
elseif ($browser == 'Opera' and $version > '7') {
 Header ("Location: opera/");}
elseif ($browser == 'Gecko') {
 Header ("Location: gecko/");}
else {Header ("Location: andere/");}
?>

Hier kommen wir zu Problem "Siehe 4": Was ist, wenn der kommende Internet Explorer 7.0 mit der jetzigen IE-Seite nicht mehr klarkommt? Was ist, wenn ein Opera 6 mit der Opera7-Version aber prima klarkommt? Warum braucht man für eine Aufgabe, die maximal genau eine Seitenversion erfordert, mindestens vier verschiedene für IE, Opera, Gecko und "Andere"?

Natürlich gibt es Unterschiede bei den ganz alten Browsern IE4, NS4 sowie neuen Modellen. Das sind aber Dinge, die man grundsätzlich in Javascript lösen kann (sofern Javascript eingesetzt wird), sowie in HTML und CSS.

Du speicherst die Datei als .php ab und fertig.
Das hat bei mir alles funktioniert, egal ob der Opera sich als iex oder gecko ausgab!

Ich habe mal einen Opera 5 so gepatcht (bzw. mit einem Hexeditor bearbeitet), dass im User-Agent-String auch für Javascript kein Text "Opera" mehr erschien. Grund: Meine Online-Bank wollte den Browser nicht reinlassen. Mit dem Patch konnte ich rein, und alles hat funktioniert.

Genau solche serverseitigen Browserweichen sind das Schreckliche! Weil man sich nämlich um die Dinger kümmern muß! Fortwährend. Weil die Browserentwicklung nicht stehenbleibt. Jede neue Browserversion muß dann mit der eigenen Seite getestet werden, eventuell muß der Erkennungscode aktualisiert werden, und sofern man seinen Code nicht nur an einer Stelle installiert hat, wächst der Aufwand je Installation natürlich noch ein beträchtliches Stück.

Da lobe ich mir doch eine 1-Versions-Seite, die aufgrund der Ausnutzung der Standards und unter Berücksichtigung der Probleme mit dem IE < 6 mit allen Browsern funktioniert. Da muß ich dann nämlich nichts updaten, wenn neue Versionen rauskommen.

Einzig was nicht ganz gut funktioniert bis jetzt ist die versionsnummer beim iex (5.5) ich muss mal noch dahinter, wie mans genau machen muss wegen dem .5

Siehst du. Ist also doch nicht alles Gold, was glänzt. Dein Code ist nicht nur schlecht, sondern auch noch falsch.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)