문제

사용자의 브라우저를 감지하는 가장 좋은/간단한/가장 정확한 방법은 무엇입니까?

확장성과 구현의 용이성은 장점입니다.

사용되는 기술이 적을수록 좋습니다.

솔루션은 서버측, 클라이언트측 또는 둘 다일 수 있습니다.하지만 결과는 결국 서버에서 끝나야 합니다.

솔루션은 프레임워크에 구애받지 않을 수 있습니다.

이 솔루션은 보고 목적으로만 사용됩니다.

도움이 되었습니까?

해결책

서버에서는 브라우저가 제공하는 UserAgent 문자열로 거의 제한됩니다(이에는 문제가 많습니다. UserAgent 문자열의 기록).

클라이언트(예: Javascript)에는 더 많은 옵션이 있습니다.그러나 가장 좋은 방법은 어떤 브라우저인지 실제로 걱정하지 않는 것입니다.사용하려는 기능이 실제로 존재하는지 확인하기만 하면 됩니다.

예를 들어 MSIE에서만 제공하는 setCapture를 사용할 수 있습니다.

if (element.setCapture) element.setCapture()

브라우저가 무엇인지 파악하고 기능을 추론하는 대신, 사용하기 전에 브라우저가 지원하는 기능이 있는지 확인하는 것입니다. 앞으로 어떤 브라우저가 무엇을 지원할지 누가 알겠습니까? 돌아가서 업데이트해야 합니까? Safari가 setCapture를 지원하기로 결정한 경우 스크립트는 어떻게 되나요?

다른 팁

그만큼 JQuery 브라우저 플러그인 클라이언트 측에서 처리해 드리겠습니다.

jQuery 브라우저 플러그인이란 무엇입니까?

jQuery 브라우저 플러그인은 방문자의 브라우저를 고유하게 식별하기 쉽게 해주는 jQuery용 애드온입니다.

그것은 무엇을 합니까?

이는 사용 중인 브라우저에 대한 모든 정보가 포함된 자바스크립트 개체를 제공합니다.또한 CSS 브라우저 선택기가 추가되어 특정 브라우저, 브라우저 버전, 레이아웃, 레이아웃 버전 및 운영 체제에 맞게 요소의 스타일을 지정하거나 기능을 작성할 수 있습니다.작동 중인 jQuery 브라우저 플러그인의 이미지.

플러그인이 만드는 것 $.browser 서버 측에서 꼭 필요한 경우 AJAX 호출을 통해 서버에 다시 제출할 수 있습니다.

alert($.browser.name);  // Alerts Firefox for me

그러나 플러그인은 테스트를 거친 브라우저만큼만 효과적입니다.위에 나열된 플러그인에는 다음 목록이 있습니다. 테스트에서 인식된 브라우저, 그러나 새 브라우저가 몰래 나올 위험은 항상 있습니다(구글 크롬..) 인식 규칙을 다시 작성해야 합니다.즉, 이 플러그인은 정기적으로 업데이트되는 것 같습니다.

자바스크립트를 사용할 때: 브라우저 감지를 사용하지 마세요

브라우저에 표시된 특정 사례에 대해 자체적으로 테스트하는 코드를 작성하세요. 그렇지 않으면 아주 작은 인구를 위한 코드를 작성하게 될 것입니다.사용하는 것이 더 좋습니다 "typeof foo == 'undefined'" 필요한 곳에 브라우저별 트릭을 적용할 수 있습니다.

jQuery는 코드베이스 전반에 걸쳐 이 작업을 수행합니다(코드를 보면 다양한 브라우저 기술에 대한 동작을 구현하는 것을 볼 수 있습니다).

장기적으로는 더 좋습니다.

방금 (지금은 삭제된 질문)에 게시했고 아직 붙여넣기 버퍼에 있으므로 다시 게시하겠습니다.메모:이것은 서버 측 PHP 솔루션입니다

현재 이를 위해 다음 코드를 사용합니다.거의 지치는 솔루션은 아니지만 더 많은 브라우저를 쉽게 구현할 수 있습니다.나는 몰랐다 user-agents.org (PConroy에게 감사드립니다.) "요즘 중 하나"를 반복하면서 목록을 업데이트하고 추가할 수 있는지 확인하겠습니다.

define("BROWSER_OPERA","Opera");
define("BROWSER_IE","IE");
define("BROWSER_OMNIWEB","Omniweb");
define("BROWSER_KONQUEROR","Konqueror");
define("BROWSER_SAFARI","Safari");
define("BROWSER_MOZILLA","Mozilla");
define("BROWSER_OTHER","other");

$aBrowsers = array
(
  array("regexp" => "@Opera(/| )([0-9].[0-9]{1,2})@", "browser" => BROWSER_OPERA, "index" => 2),
  array("regexp" => "@MSIE ([0-9].[0-9]{1,2})@", "browser" => BROWSER_IE, "index" => 1),
  array("regexp" => "@OmniWeb/([0-9].[0-9]{1,2})@", "browser" => BROWSER_OMNIWEB, "index" => 1),
  array("regexp" => "@(Konqueror/)(.*)(;)@", "browser" => BROWSER_KONQUEROR, "index" => 2),
  array("regexp" => "@Safari/([0-9]*)@", "browser" => BROWSER_SAFARI, "index" => 1),
  array("regexp" => "@Mozilla/([0-9].[0-9]{1,2})@", "browser" => BROWSER_MOZILLA, "index" => 1)
);

foreach($aBrowsers as $aBrowser)
{
  if (preg_match($aBrowser["regexp"], $_SERVER["HTTP_USER_AGENT"], $aBrowserVersion))
  {
    define("BROWSER_AGENT",$aBrowser["browser"]);
    define("BROWSER_VERSION",$aBrowserVersion[$aBrowser["index"]]);
    break;
  }
}

댄이 말했듯이:사용된 기술에 따라 다릅니다.

PHP 서버 측 브라우저 감지의 경우 Harald Hope의 브라우저 감지를 권장합니다.

http://techpatterns.com/downloads/php_browser_Detection.php

GPL로 출판되었습니다.

브라우저 감지를 사용하지 마세요:

  • 브라우저 감지는 최상의 상황에서도 100% 신뢰할 수는 없지만 상황은 이보다 더 악화됩니다.
  • 브라우저에는 다양한 변형이 있습니다(MSIE 사용자 정의 등).
  • 브라우저는 자신의 신원에 대해 거짓말을 할 수 있습니다(Opera에는 실제로 이 기능이 내장되어 있습니다).
  • 게이트웨이는 브라우저의 신원을 숨기거나 난독화합니다.
  • 사용자 정의 및 게이트웨이 공급업체는 USER_AGENT에 자체 쓰레기를 작성합니다.

클라이언트 스크립트에서 기능 감지를 수행하는 것이 더 좋습니다.특정 브라우저 및 버전의 버그를 해결하려면 브라우저 감지만 필요합니다.

나는 원래 사람들이 내 사이트에 액세스하는 데 사용하는 브라우저와 운영 체제를 기록하고 싶어서 이 질문을 했습니다.예, 사용자 에이전트 문자열은 신뢰할 수 없습니다. 예, JS에서 실행할 코드를 결정하기 위해 브라우저 감지를 사용해서는 안 됩니다. 하지만 가능한 한 정확한 통계를 갖고 싶습니다.

나는 다음을 수행했습니다.

저는 통계를 기록하기 위해 JavaScript와 PHP의 조합을 사용하고 있습니다.어떤 브라우저와 OS를 결정하는 JavaScript(이것은 아마 가장 정확함) 및 이를 기록하는 PHP:

자바스크립트는 다음에서 유래합니다. 쿼크스모드, PHP는 자명합니다.나는 MooTools JS 프레임워크.

BrowserDetect 스크립트에 다음을 추가합니다.

window.addEvent('domready', function() {
    if (BrowserDetect) {
        var q_data = 'ajax=true&browser=' + BrowserDetect.browser + '&version=' + BrowserDetect.version + '&os=' + BrowserDetect.OS;
        var query = 'record_browser.php'
        var req = new Request.JSON({url: query, onComplete: setSelectWithJSON, data: q_data}).post();
    }
});

이는 사용자 브라우저의 브라우저, 브라우저 버전, OS를 파악하여 이를 record_browser.php 스크립트.그만큼 record_browser.php 스크립트는 PHP와 함께 정보를 추가합니다. session_id 그리고 현재 user_id, 존재하는 경우.

MySQL 테이블:

CREATE TABLE `browser_detects` (
  `id` int(11) NOT NULL auto_increment,
  `session` varchar(255) NOT NULL default '',
  `user_id` int(11) NOT NULL default '0',
  `browser` varchar(255) NOT NULL default '',
  `version` varchar(255) NOT NULL default '',
  `os` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `sessionUnique` (`session`)
)

PHP 코드:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $session = session_id();
    $user_id = isset($user_id) ? $user_id ? 0;
    $browser = isset($_POST['browser']) ? $_POST['browser'] ? '';
    $version = isset($_POST['version']) ? $_POST['version'] ? '';
    $os = isset($_POST['os']) ? $_POST['os'] ? '';
    $q = $conn->prepare('INSERT INTO browser_detects (`session`, `user`, `browser`, `version`, `os`) VALUES (:session :user, :browser, :version, :os)');
    $q->execute(array(
                    ':session' => $session,
                    ':user' => $user_id,
                    ':browser' => $browser,
                    ':version' => $version,
                    ':os' => $os
                ));
}

많은 사람들이 말했듯이 브라우저 감지는 매우 잘못될 수 있습니다.그러나 Code Golf의 이익을 위해.

이는 IE를 감지하는 매우 빠른 방법입니다.

<script>
  if('\v'=='v'){
    alert('I am IE');
  } else {
    alert('NOT IE');
  }
</script>

Opera에 걸려 넘어지지 않고 IE를 선택하기 때문에 실제로 매우 깔끔합니다.

알고 계시다면 보너스 포인트 이것은 IE에서 작동합니다.;-)

이것은 제가 사용하는 C# 코드입니다. 도움이 되기를 바랍니다.

StringBuilder strb = new StringBuilder();
strb.AppendFormat ( "User Agent: {0}{1}", Request.ServerVariables["http_user_agent"].ToString(), Environment.NewLine );
strb.AppendFormat ( "Browser: {0}{1}", Request.Browser.Browser.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Request.Browser.Version.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Major Version: {0}{1}", Request.Browser.MajorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Minor Version: {0}{1}", Request.Browser.MinorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Platform: {0}{1}", Request.Browser.Platform.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ECMA Script version: {0}{1}", Request.Browser.EcmaScriptVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Type: {0}{1}", Request.Browser.Type.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}",  Environment.NewLine );
strb.AppendFormat ( "ActiveX Controls: {0}{1}", Request.Browser.ActiveXControls.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Background Sounds: {0}{1}", Request.Browser.BackgroundSounds.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "AOL: {0}{1}", Request.Browser.AOL.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Beta: {0}{1}", Request.Browser.Beta.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "CDF: {0}{1}", Request.Browser.CDF.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ClrVersion: {0}{1}", Request.Browser.ClrVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Cookies: {0}{1}", Request.Browser.Cookies.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Crawler: {0}{1}", Request.Browser.Crawler.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Frames: {0}{1}", Request.Browser.Frames.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Tables: {0}{1}", Request.Browser.Tables.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaApplets: {0}{1}", Request.Browser.JavaApplets.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaScript: {0}{1}", Request.Browser.JavaScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "MSDomVersion: {0}{1}", Request.Browser.MSDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "TagWriter: {0}{1}", Request.Browser.TagWriter.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "VBScript: {0}{1}", Request.Browser.VBScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "W3CDomVersion: {0}{1}", Request.Browser.W3CDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win16: {0}{1}", Request.Browser.Win16.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win32: {0}{1}", Request.Browser.Win32.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}", Environment.NewLine );
strb.AppendFormat ( "MachineName: {0}{1}", Environment.MachineName, Environment.NewLine );
strb.AppendFormat ( "OSVersion: {0}{1}", Environment.OSVersion, Environment.NewLine );
strb.AppendFormat ( "ProcessorCount: {0}{1}", Environment.ProcessorCount, Environment.NewLine );
strb.AppendFormat ( "UserName: {0}{1}", Environment.UserName, Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Environment.Version, Environment.NewLine );
strb.AppendFormat ( "UserInteractive: {0}{1}", Environment.UserInteractive, Environment.NewLine );
strb.AppendFormat ( "UserDomainName: {0}{1}", Environment.UserDomainName, Environment.NewLine );

편집하다:아래 해결 방법은 권장되지 않습니다.대신 이것을 시도해 보세요: http://whichbrowser.net/

이것은 한때 나에게 효과가 있었지만 지금 코드를 보면 어떻게되는지 모르겠습니다.대신 위의 내용을 사용하세요 :-/

<script type="text/javascript">
    // <![CDATA[
    var BrowserCheck = Class.create({
        initialize: function () {
            var userAgent = navigator.userAgent.toLowerCase();
            this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1];
            this.safari = /webkit/.test(userAgent) && !/chrome/.test(userAgent);
            this.opera = /opera/.test(userAgent);
            this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent);
            this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent);
            this.chrome = /chrome/.test(userAgent);
        }
    });    
    // ]]>
</script>

이를 사용하려면 초기화해야 한다는 점을 잊지 마십시오. 코드에 다음을 입력하십시오.

var UserBrowser = new BrowserCheck();

그런 다음 다음과 같이 브라우저 유형과 버전을 확인하세요.(예:인터넷 익스플로러 8)

if ((UserBrowser.msie == true) && (UserBrowser.version == 8))

등.

우리처럼 여러분에게도 효과가 있기를 바랍니다. 하지만 브라우저 감지가 완벽하지 않다는 점을 기억하세요!

Internet Explorer 및 스타일 시트의 경우 다음 구문을 사용할 수 있습니다.

<!--[if lte IE 6]><link href="/style.css" rel="stylesheet" type="text/css" /><![endif]-->

이는 IE 6 이하에 적용됩니다.IE 버전을 변경하고 다음을 수행할 수도 있습니다.

<!--[if eq IE 7]> = Equal too IE 7
<!--[if gt IE 6]> = Greater than IE 6

이것이 페이지의 다른 부분에서는 작동하는지 확실하지 않지만 <head> 꼬리표.이것 좀 봐 자세한 내용은

일반적으로 브라우저가 요청을 하면 많은 정보(시간, 이름, 날짜, 사용자 에이전트...)를 보냅니다.클라이언트가 보낸 헤더를 보고 브라우저에 알려주는 헤더로 이동해야 합니다("User-Agent:"인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top