serverseitige Browserunterscheidung
Fabian
- browser
0 john19670 john19670 MudGuard0 john1967
0 Fabian0 Sven Rautenberg
0 Thomas Luethi
Hi!
Wie kann man denn serverseitig den Browser bestimmen. Mir ist vor Allem wichtig, dass der Opera 100%ig von den anderen Browsern unterschieden werden kann. auch, wenn er sich als ein anderer Browser ausgibt!
Geht das? Serverseitrig - ohne JavaScript - da wüsste ich wies geht!
Gruß, Fabian.
Hallo Fabian
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:
<?php
function inAgent($agent){
global $HTTP_USER_AGENT, $thestring, $place;
$thestring = strtolower($agent);
$place = strpos(strtolower($HTTP_USER_AGENT), $thestring) + 1;
return eregi($agent, $HTTP_USER_AGENT);
}
if (inAgent('konqueror')){
$browser = 'Konqueror';
$os = 'Linux';
}
elseif (inAgent('w3c_validator'))$browser = 'W3C_Validator';
elseif (inAgent('jigsaw')){
$browser = 'W3C_CSS_Validator';
$version = substr($HTTP_USER_AGENT, $place + strlen($thestring), 6);
}
elseif (inAgent('googlebot')) $browser = 'Googlebot';
elseif (inAgent('lynx'))$browser = 'Lynx';
elseif (inAgent('omniweb'))$browser = 'OmniWeb';
elseif (inAgent('opera'))$browser = 'Opera';
elseif (inAgent('webtv'))$browser = 'WebTV';
elseif (inAgent('icab'))$browser = 'iCab';
elseif (inAgent('msie'))$browser = 'Internet Explorer';
elseif (inAgent('gecko'))$browser = 'Gecko';
elseif (!inAgent('compatible')){
$browser = 'Netscape Navigator';
$version = substr($HTTP_USER_AGENT, 8, 4);
}
else $browser = 'unknown browser';
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';
}
?>
UND dann spezifizierst du in einem file von welchem du aus weiterleiten willst ganz oben z.b sowas:
<?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/");}
?>
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!
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
Nachtrag:
Das Skript leitet dich natürlich gleich weiter... Wenn du was anderes machen willst, musst du "Location: iex/" ändern...
Hi,
if ($browser == 'Internet Explorer' and $version > '5.5') {
Header ("Location: iex/");}
Auch wenn's schon tausendmal im Archiv steht, wird es leider immer noch falsch gemacht:
Ein http-Location-Header MUSS eine absolute URL enthalten.
cu,
Andreas
Auch wenn's schon tausendmal im Archiv steht, wird es leider immer noch falsch gemacht:
Ein http-Location-Header MUSS eine absolute URL enthalten.
hmm.. darf man dann bitte noch ein 1001. mal fragen wieso? oder wieso es dann troztdem ohne funktioniert?
gruss john
Hi,
Auch wenn's schon tausendmal im Archiv steht, wird es leider immer noch falsch gemacht:
Ein http-Location-Header MUSS eine absolute URL enthalten.
hmm.. darf man dann bitte noch ein 1001. mal fragen wieso? oder wieso es dann troztdem ohne funktioniert?
Weil es so festgelegt ist.
Und es funktioniert in einigen Fällen, weil die Browser fehlertolerant sind. Aber auf Fehlertoleranz sollte man sich NIE verlassen.
cu,
Andreas
Moin!
Auch wenn's schon tausendmal im Archiv steht, wird es leider immer noch falsch gemacht:
Ein http-Location-Header MUSS eine absolute URL enthalten.hmm.. darf man dann bitte noch ein 1001. mal fragen wieso? oder wieso es dann troztdem ohne funktioniert?
Wieso? Weil es im Standard so festgelegt ist!
Warum es dennoch funktioniert? Weil _einige_ Browser auch relative URLs akzeptieren, andere hingegen nicht. Weil du gerade mit PHP werkelst: PHP versteht relative Redirects beispielsweise nicht, wenn man eine HTTP-URL mit fopen() öffnet. Lynx auch nicht.
Und es ist ja auch nicht wirklich schwer, sich aus den servereigenen Angaben eine absolute URL zusammenzusetzen.
- Sven Rautenberg
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
Mhmm.. Ich muss eigentlich den IE5.5 vom IE 5 unterscheiden können.
Geht das jetzt nuicht?
Fabian, ich habs nochmal studiert...
und jetzt mit den absoluten URLs (lies die anderen antworten) funktioniert die unterscheidung zwischen 5.0 und 5.5 gut!
du musst einfach
if ($browser == 'Internet Explorer' and $version > '5.4')
reintun! dann geht der internet explorer der grösser ist als 5.4 (also z.b. 5.5, 6) irgendwo hin...
gruss john
sers,
if ($browser == 'Internet Explorer' and $version > '5.4')
wenn, dann wäre wohl ein größer/gleich 5.5 richtig... ($version > = '5.5')
aber lasse die Browserweiche sein (so wie dir auch schon geraten wurde)
gruß,
benne
an der browserweiche wird sowieso nix mehr geändert bei mir... wenn du mich meinst...
bei mir ist sie nämlich schon drin und funktioniert bisher perfekt... egal wie krüppelig der code ist... anders kann ich es nicht machen, ich will die geilen css features nutzen, aber anderseits will ich auch, dass die leute mit irgendeinem sh1-browser auch was sehen... von daher hab ich die browserweiche drin...
heutzutage mach ich aber schon pages, die ohne funktionieren sollten, natürlich funktionieren die dann halt nicht umbedingt auf opera 3.2 u.ä. :)
hi,
heutzutage mach ich aber schon pages, die ohne funktionieren sollten, natürlich funktionieren die dann halt nicht umbedingt auf opera 3.2 u.ä. :)
ein tierfutterhersteller wird heutzutage wohl auch wenig wert darauf legen, mehr kosten für die entwicklung seines produktes in kauf zu nehmen, weil seine schoßhundenahrung ansonsten bei dinosaurieren zu verdauungsproblemen führen könnte ...
gruss,
wahsaga
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
Sven Sven, bitte. Das ist nicht MEIN code!! ich hab das irgendwo im netz gefunden und ein bisschen angepasst...
ich selbst hab eigentlich keine grosse ahnung von php, daher behaupte ich überhaupt nicht, dass der code gut ist. ich dachte einfach, wenn sowas als tutorial gepostet wird, dass das dann gut sein sollte...
das ganze entstand im stress und musst einfach her, weil ich javascript zu hassen begann. normalerweise setze ich auch wert auf guten code, aber da wars mir egal. aber vielen dank, dass du mich so gut aufklärst. ich weiss jetzt nicht so recht, ob ich deswegen gleich auch php noch lernen muss, um diese fehlerkorrekturen überhaupt verstehen zu können...
gruss john
Moin!
Sven Sven, bitte. Das ist nicht MEIN code!! ich hab das irgendwo im netz gefunden und ein bisschen angepasst...
Das macht ihn nicht besser, sondern läßt ihn in demselben jämmerlichen Zustand, den er vorher schon hatte.
ich selbst hab eigentlich keine grosse ahnung von php, daher behaupte ich überhaupt nicht, dass der code gut ist. ich dachte einfach, wenn sowas als tutorial gepostet wird, dass das dann gut sein sollte...
Du hast den Code hier ins Forum gepostet. Das sollte man entweder tun, weil man mit dem Code im Rahmen einer Frage ein Problem hat, oder weil man weiß, was der Code tut und dass er gut ist.
Dass dein Code nicht so gut ist, ist ja jetzt bekannt. Bedenke, dass alles archiviert wird - da muß mein Kommentar einfach danebenstehen, um Leute vor der Verwendung abzuhalten.
ich weiss jetzt nicht so recht, ob ich deswegen gleich auch php noch lernen muss, um diese fehlerkorrekturen überhaupt verstehen zu können...
Du setzt PHP-Code ein. Woher willst du wissen, dass man dir nicht ein trojanisches Pferd untermogelt, wenn du nicht weißt, was da programmiert wurde? Oder dass Sicherheitslücken gerissen wurden.
Du lebst gefährlich, würde ich meinen...
- Sven Rautenberg
Du setzt PHP-Code ein. Woher willst du wissen, dass man dir nicht ein trojanisches Pferd untermogelt, wenn du nicht weißt, was da programmiert wurde? Oder dass Sicherheitslücken gerissen wurden.
Du lebst gefährlich, würde ich meinen...
nun übertreib mal nicht... :)
ich dachte, man kann einem anderen forum wie diesem (einfach in englisch) schon als gute herkunfts-quelle trauen. diesmal gings halt ein bisschen schief. der code funktioniert aber zumindest und macht keine schwierigkeiten, und z.t. verstehe ich die dinge natürlich auch, so blöd bin ich sicher nicht, also krieg ich sicher keine trojanischen pferde.
ich werde, wenn ich zeit habe, mir einen neuen code suchen und es auch zu verstehen lernen.
ich wollte hier wirklich kein schlechtes zeugs posten, das würd ich nie absichtlich machen, es war wirklich nur ein versehen, dass ich sowas postete. Da ich seit einem monat den code im einsatz hab und er überhaupt (Ü B E R H A U P T) keine probleme gemacht hatte, dachte ich halt, so sozial wie ich bin, ich helf dem fabian mal. aber wenns euch lieber ist, frag ich halt weiter nur schwierige dinge und werde nicht zu posten anfangen, oder höchstens mit dingen, von denen ich wirklich was verstehe, so wie z.b. css oder gestaltung allgemein.
gruss john, und entschuldigung für diesen fehler.
nun übertreib mal nicht... :)
genau.
Dankle für die Hilfe
Hallo,
Wie kann man denn serverseitig den Browser bestimmen. Mir ist vor Allem wichtig, dass der Opera 100%ig von den anderen Browsern unterschieden werden kann. auch, wenn er sich als ein anderer Browser ausgibt!
Er hat immer irgendwo ein "Opera" im User-Agent-String,
mit dem er sich gegenueber dem Browser identifiziert.
http://www.tiptom.ch/tests/useragent.html
In PHP-Skripten ist dies die Umgebungsvariable $HTTP_USER_AGENT bzw.
$_SERVER["HTTP_USER_AGENT"]; fuer SSI und in CGI-Skripten heisst
die Umgebungsvariable HTTP_USER_AGENT.
Browserweichen sind IMHO ueberfluessiger Humbug.
Meist werden sie missbraucht, um Leute auszusperren,
obwohl es ueberhaupt keinen Grund dafuer gibt.
Gruesse,
Thomas