Определение версии браузера IE с использованием PHP - PullRequest
3 голосов
/ 10 июля 2010

Я использую $ _SERVER ['HTTP_USER_AGENT'] для определения браузера пользователя. Когда я запускаю var_dump на моем локальном хосте в IE8, он возвращает: ... совместимый; MSIE 8.0; ... Но когда я загружаю его на мой хост (godaddy), я получаю: ... совместимый; MSIE 7.0; ...

В чем проблема?

Ответы [ 4 ]

9 голосов
/ 10 июля 2010

Я использую $ _SERVER ['HTTP_USER_AGENT'] для обнаружения браузера пользователя

Да, это проблема. Не делай этого.

User-Agent взлом строки - проигрышная игра. Существует множество странных ситуаций, которые могут запутать ваши сценарии.

Это один из них: IE8 по умолчанию в режиме совместимости претендует на IE7. Вы можете обнаружить этот случай по присутствию Trident/... в строке, но, конечно же, как и у всех «решений» по взлому строк, все пойдет не так, если эта строка присутствует по другим причинам, которые могут быть даны, что любой приложение может прикрепить произвольные строки к концу заголовка User-Agent в IE, и в действительности, учитывая, что браузеры регулярно врут о том, кто они, а посредники могут изменять или удалять заголовок.

Кроме того, выполняя сниффинг в браузере на стороне сервера, вы заставляете свои HTTP-ответы зависеть от браузера, просматривающего их, что означает, что прокси-кэши будут показывать неправильную страницу не тому браузеру, если вы не включите правильный Vary заголовок. Но если вы сделаете это, вы нарушите кеширование в IE.

Обнюхивание UA на стороне сервера - это ужас, который вам следует использовать только в качестве крайней меры, если действительно невозможно использовать какую-либо другую технику. Для обычного случая показа различного контента в определенных версиях IE вам гораздо лучше использовать условные комментарии.

2 голосов
/ 10 июля 2010

Проверьте слово TRIDENT в строке. Дело в совместимости, т.е. в режиме совместимости. Google, если вы хотите знать, что это значит. Тем не менее, термин трезубец только то, что 8 +.

Edit: Кроме того, вы можете установить заголовок / метатег для включения режима ie8 (без совместимости) Однако это, вероятно, не вступит в силу до второго запроса. Гугл это тоже.

1 голос
/ 10 июля 2010

Попробуйте get_browser() и посмотрите, что произойдет.

По ссылке:

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>

Вывод:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3

Array
(
    [browser_name_regex] => ^mozilla/5\.0 (windows; .; windows nt 5\.1; .*rv:.*) gecko/.* firefox/0\.9.*$
    [browser_name_pattern] => Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:*) Gecko/* Firefox/0.9*
    [parent] => Firefox 0.9
    [platform] => WinXP
    [browser] => Firefox
// ...
0 голосов
/ 20 декабря 2012
preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
echo $version = $matches[1];
...