詳細検索

Respondendo à formatação do UserAgent alterada no Internet Explorer 11

Avatar
por maeno
3 min de leitura

Respondendo à formatação do UserAgent alterada no Internet Explorer 11
Traduzido do 日本語 • Ver original

Quando recebemos um relatório de que ocorreu um problema no navegador Internet Explorer 11 (doravante chamado de IE11) em um sistema que vinha rodando sem problemas até agora, descobrimos que o formato do agente de usuário havia sido alterado no IE11 e o processo de julgamento do navegador foi tratado como um "navegador desconhecido".
Até agora, eu vinha usando o token da versão do navegador do user agent (a parte onde o UA diz "MSIE 9.0" ou algo assim) para obter o julgamento do navegador IE e a versão do IE, mas a partir do IE11, esse token de versão do navegador desapareceu, e um novo token de revisão chamado "RV" foi fornecido (*modo padrão do navegador do IE11).
Para julgar de forma única o IE, incluindo o IE11 no futuro, a confirmação da existência do token Trident do motor de navegador (a parte onde "Trident/7.0" em UA está escrito) também deve ser determinada pela condição OR.

UserAgent no IE11

  • [Modo navegador: padrão] Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) como Gecko
  • [Modo navegador: exibição de compatibilidade] Mozilla/4.0 (compatível; MSIE 7.0; Windows NT 6.3; Trident/7.0)

O problema é o modo de exibição de compatibilidade do IE. O modo de exibição de compatibilidade do IE é um recurso introduzido pelo IE9, mas se você usar esse modo, o token da versão do navegador UA será o IE7 em todos os IEs atuais. Para julgar corretamente o IE11 como exibição de compatibilidade, é necessário primeiro determinar o token tridente, e se a versão do trident for 7.0 ou superior, ele é julgado como IE11, e a versão do navegador é obtida a partir do token de revisão, e a outra versão é obtida do token da versão do navegador. Além disso, é necessário processar para IE9 e IE10, que possuem modos de exibição de compatibilidade inferiores ao IE11.
Além disso, IE7 e inferiores não possuem token trident, então também é necessário processamento separado de julgamento para IE7... (Não, é como assédio...).

Como teste, modifiquei o processamento único de julgamento de dispositivo cliente (PHP) usado neste DEVLAB para suportar o IE11.

Primeiramente, o conteúdo do processamento de julgamento do IE até agora.
[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['navegador'] = ''; $results['versão'] = ''; se (grávido_match('/(MSIE \d{1,}?(. \d{1,}?) {1,}?;) /', $ua, $mtcs)) { $results['browser'] = 'msie'; list(, $vstr) = explode(' ', str_replace(';', '', $mtcs[0])); $results['versão'] = $vstr; } [/php]

Eu mudei isso da seguinte forma.
O processamento do extrator de números de versão também foi meio fraco, então corrigi.

[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['browser'] = ''; $results['versão'] = ''; se (preg_match('/Trident\/(\d{1,}(.\d{1,}){1,}?) /i', $ua, $mtcs)) { $results['browser'] = 'msie'; se (float)$mtcs[1] >= 7) { se (preg_match('/rv:(\d{1,}(.\d{1,}){1,}?) /i', $ua, $mtcs)) { $results['versão'] = (flutuar)$mtcs[1]; } senão { $results['versão'] = 11.0; } } elseif (float)$mtcs[1] >= 6) { $results['version'] = 10.0; } elseif (float)$mtcs[1] >= 5) { $results['versão'] = 9.0; } elseif (float)$mtcs[1] >= 4) { $results['version'] = 8.0; } } if (vty($results['browser'])) { if (grávida_match('/MSIE\s(\d{1,}(.\d{1,}){1,}? ); /i', $ua, $mtcs)) { $results['browser'] = 'msie'; $results['versão'] = (flutuar)$mtcs[1]; } } [/php]

Não gosto que existam tantos passos só para julgar, por exemplo...

Para ser honesto, gostaria que você parasse de mudar o formato do UserAgent com upgrades além de alterações no motor do navegador ou grandes mudanças fundamentais nas especificações...

Related Articles