詳細検索

Internet Explorer 11에서 변경된 UserAgent 형식에 대한 응답

아바타
글쓴이 maeno
4분 읽기

Internet Explorer 11에서 변경된 UserAgent 형식에 대한 응답
日本語에서 번역 • 원문 보기

지금까지 문제 없이 실행되던 시스템에서 Internet Explorer 11(이하 IE11이라 함) 브라우저에서 문제가 발생했다는 보고를 받았을 때, IE11에서 사용자 에이전트 형식이 변경되었고 브라우저 판단 과정이 "미확인 브라우저"로 처리된 것을 발견했습니다.
지금까지 저는 사용자 에이전트의 브라우저 버전 토큰(UA에서 "MSIE 9.0" 같은 문구를 표시하는 부분)을 사용해 IE 브라우저 판단과 IE 버전을 얻었는데, IE11부터는 이 브라우저 버전 토큰이 사라지고 "rv"라는 새로운 리비전 토큰(*IE11 표준 브라우저 모드)이 제공되었습니다.
미래의 IE를 포함해 IE를 고유하게 판단하려면, 브라우저 엔진 트라이던트 토큰(UA에서 "Trident/7.0"이 표기된 부분)의 존재 확인도 OR 조건에 의해 결정되어야 합니다.

IE11의 UserAgent

  • [브라우저 모드: 표준] Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; 터치; rv:11.0) 게코와 같은
  • [브라우저 모드: 호환성 표시] Mozilla/4.0 (호환; MSIE 7.0; Windows NT 6.3; Trident/7.0)

문제는 IE의 호환성 표시 모드입니다. IE의 호환성 표시 모드는 IE9에서 도입된 기능이지만, 이 모드를 사용하면 모든 현재 IE에서 UA 브라우저 버전 토큰은 IE7이 됩니다. IE11을 호환성 표시로 정확히 판단하려면 먼저 삼지창 토큰을 결정해야 하며, 삼지창 버전이 7.0 이상이면 IE11로 판단하고, 브라우저 버전은 수정 토큰에서, 다른 버전은 브라우저 버전 토큰에서 얻습니다. 또한, IE9와 IE10도 IE11보다 호환성 표시 모드가 낮기 때문에 처리해야 합니다.
또한 IE7 이하에는 트라이던트 토큰이 없어서 IE7에 대한 별도의 판결 처리가 필요합니다... (아니요, 괴롭힘 같은 겁니다...).

테스트로, 이 DEVLAB에서 사용된 독특한 클라이언트 디바이스 판단 처리(PHP)를 IE11을 지원하도록 수정했습니다.

우선, 지금까지 진행된 독립 판결 처리 내용부터 말씀드리겠습니다.
[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['브라우저'] = ''; $results['버전'] = ''; 만약 (임신_match('/(MSIE \d{1,}?(. \d{1,}?) {1,}?;) /', $ua, $mtcs)) { $results['브라우저'] = 'msie'; list(, $vstr) = explode(' ', str_replace(';', '', $mtcs[0])); $results['version'] = $vstr; } [/php]

이렇게 변경했습니다.
버전 번호 추출기 처리 과정도 좀 별로였는데, 그래서 고쳤습니다.

[php] $ua = $_SERVER['HTTP_USER_AGENT']; $results['브라우저'] = ''; $results['version'] = ''; if (preg_match('/Trident\/(\d{1,}(.\d{1,}){1,}){1,}?) /i', $ua, $mtcs)) { $results['브라우저'] = 'msie'; if ((float)$mtcs[1] >= 7) {if (preg_match('/rv:(\d{1,}(.\d{1,}){1,}){1,}?) /i', $ua, $mtcs)) { $results['version'] = (float)$mtcs[1]; } 그렇지 않으면 { $results['version'] = 11. 0; } } elseif ((float)$mtcs[1] >= 6) { $results['version'] = 10.0; } elseif ((float)$mtcs[1] >= 5) { $results['version'] = 9.0; } elseif ((float)$mtcs[1] >= 4) { $results['version'] = 8.0; } } if (empty($results['browser'])) {if (preg_match('/MSIE\s(\d{1,}(.\d{1,}){1,}?{1,}? ); /i', $ua, $mtcs)) { $results['브라우저'] = 'msie'; $results['version'] = (float)$mtcs[1]; } } [/php]

저는 단순히 예언 절차를 너무 많이 해야 하는 게 마음에 들지 않아요...

솔직히 말해서, 브라우저 엔진 변경이나 주요 기본 사양 변경 외에는 UserAgent 포맷을 변경하는 것을 중단했으면 합니다...

Related Articles