Пользовательский агент IE 9 лжет! Самое странное, что я когда-либо видел - PullRequest
1 голос
/ 30 марта 2012

Итак, вот мое затруднение.У меня есть сайт, который очень чувствителен к пользовательским агентам.Совершенно важно, чтобы на сайт был отправлен правильный пользовательский агент, иначе сайт не будет работать для этого пользователя.Сайт работает нормально, если пользователь не перенаправлен туда через постоянный редирект.

Вот где он становится интересным.Видите ли, Firefox и Chrome не имеют проблем.Но IE начинает врать о том, какую версию браузера вы используете, как только увидит статус и изменение домена.У меня есть клиент (очень большой медленный клиент), связывающий мой сайт извне с помощью перманентного перенаправления.И я не думаю, что у этого клиента есть возможность изменить это прямо сейчас.Таким образом, я застрял с этим, и мое обнаружение в браузере становится проблематичным, когда IE перестает быть:

Mozilla / 5.0 (совместимый; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 5.0)

до:

Совместимость с Mozilla / 4.0;MSIE 7.0;Windows NT 6.1;WOW64;Trident / 5.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Медиа Центр ПК 6.0;.NET4.0C;InfoPath.3

Некоторые вещи, которые я пробовал: Добавлен метатег, который изменяет механизм рендеринга:

<meta content="IE=7" http-equiv="X-UA-Compatible" />

Работает в IE 8, но 9 игнорирует его.Пробовал обнаруживать разные версии .net framework, но это не всегда надежно.Пробовал использовать тэг Canvas в Javascript, но это сломало его только в IE 7, а иногда и 8.

Я думаю, что должен быть какой-то заголовок, который я могу добавить к нему, но я не знаюлюбого.

Кто-нибудь видел это раньше?Есть ли функциональный обходной путь?

Редактировать: Кто-то предложил модернизатор.Это потрясающая идея.

Еще одна вещь, которую я сделал, чтобы решить эту проблему, была переписать мой скрипт обнаружения браузера.

Вот, если кто-нибудь когда-нибудь столкнется с подобной проблемой: он грязный, но работает.

function getBrowser() {

    //shamlessly "borrowed" from the manual at http://php.net/manual/en/function.get-browser.php
    //Needed some cleanup.
    //Still needs some cleanup

    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version = "";
    $xploded = explode(';',$u_agent);

    //pretty($xploded);

    // finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
           ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
      // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
      //we will have two since we are not using 'other' argument yet
      //see if version is before or after the name
      if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
        $version = $matches['version'][0];
      } else {
        $version = $matches['version'][1];
      }
    } else {
      $version = $matches['version'][0];
    }


    // check if wfunction getBrowser() {
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version = "";

    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
      $platform = 'linux';
    } elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
      $platform = 'mac';
    } elseif (preg_match('/windows|win32/i', $u_agent)) {
      $platform = 'windows';
    }

    // Next get the name of the useragent yes seperately and for good reason
    if (preg_match('/MSIE/i', $u_agent) && !preg_match('/Opera/i', $u_agent)) {
      $bname = 'Internet Explorer';
      $ub = "MSIE";
    } elseif (preg_match('/Firefox/i', $u_agent)) {
      $bname = 'Mozilla Firefox';
      $ub = "Firefox";
    } elseif (preg_match('/Chrome/i', $u_agent)) {
      $bname = 'Google Chrome';
      $ub = "Chrome";
    } elseif (preg_match('/Safari/i', $u_agent)) {
      $bname = 'Apple Safari';
      $ub = "Safari";
    } elseif (preg_match('/Opera/i', $u_agent)) {
      $bname = 'Opera';
      $ub = "Opera";
    } elseif (preg_match('/Netscape/i', $u_agent)) {
      $bname = 'Netscape';
      $ub = "Netscape";
    }

    // finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
           ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
      // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
      //we will have two since we are not using 'other' argument yet
      //see if version is before or after the name
      if (strripos($u_agent, "Version") < strripos($u_agent, $ub)) {
        $version = $matches['version'][0];
      } else {
        $version = $matches['version'][1];
      }
    } else {
      $version = $matches['version'][0];
    }
    // check if we have a number
    if ($version == null || $version == "") {
      $version = "?";
    }

    $bname = strtolower($bname);
    $windows_version = floatval(trim(str_ireplace('Windows NT','',$xploded[2]) ));

    //Sloppy hack for dealing with IE 9, specifically.
    $trial = intval($version);
    if($windows_version == 6.1 && $bname == 'internet explorer' && $trial == 7){
        //the browser is lying to you.
        //print "We are being lied to<br>";
        $version = 9.0;
    }

    //print 'windows version is......'.$windows_version.'<br>';
    //print 'browser id is......'.$bname.'<br>';
    //print 'raw version is......'.$version.'<br>';


    return array(
        'test'=>'test',
        'name' => $bname,
        'version' => intval($version)
    );
}

1 Ответ

3 голосов
/ 30 марта 2012

К сожалению, поскольку вы унаследовали сайт, который изначально делал не то, вам придется медленно начинать переносить части функциональности на использование обнаружения функций, а не на прослушивание UA.

Я бы посоветовал вамчтобы установить Modernizer и медленно начать портирование.Начните с самых неработающих страниц и перейдите оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...