2010-02-13 25 views
27

Cố gắng phát hiện trình duyệt của người dùng chỉ với PHP, là $ _SERVER ['HTTP_USER_AGENT'] một cách đáng tin cậy? Tôi có nên chọn chức năng get_browser không? cái nào bạn tìm thấy mang lại kết quả chính xác hơn?phát hiện trình duyệt người dùng đáng tin cậy với php

Nếu phương pháp này là thực tế, là nó bị bệnh nên sử dụng nó cho xuất ra các liên kết CSS thích hợp, ví dụ:

if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false) 
    echo '<link type="text/css" href="mozilla.css" />'; 

tôi nhận thấy this question, tuy nhiên tôi muốn làm rõ liệu điều này là tốt cho CSS theo định hướng phát hiện.

UPDATE: một cái gì đó thực sự đáng ngờ: Tôi cố gắng echo $_SERVER['HTTP_USER_AGENT']; trên IE 7 và đây là những gì nó ra:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

Safari cho một cái gì đó kỳ lạ với "mozilla" trong đó quá. Đưa cái gì?

+0

Bit "Mozilla/4.0" nằm trong đó vì lý do cũ ... ngay cả trong IE8. – scunliffe

+0

IE tự xác định mình đã yên lặng một thời gian với tư cách là Mozilla 4.0. Tôi đã đọc rằng họ đã làm điều này vì lý do tương thích, nhưng không thể tìm thấy nguồn ngay bây giờ.Nếu tôi phải đoán, tôi muốn nói đây là một mảnh vỡ từ thời gian NetScape/IE. – Bobby

+0

* Tác nhân người dùng * không đáng tin cậy. Nhưng đó là cách duy nhất để đoán. – Gumbo

Trả lời

15

Sử dụng phương pháp hiện có (ví dụ: get_browser) có lẽ tốt hơn là tự viết một cái gì đó vì nó có hỗ trợ (tốt hơn) và sẽ được cập nhật với các phiên bản mới hơn. Cũng có thể có các thư viện có thể sử dụng để tìm id trình duyệt một cách đáng tin cậy.

Giải mã $_SERVER['HTTP_USER_AGENT'] rất khó, vì rất nhiều trình duyệt có dữ liệu tương tự và có xu hướng sử dụng nó vì lợi ích của chính chúng. Nhưng nếu bạn thực sự muốn giải mã chúng, bạn có thể sử dụng thông tin trên this page cho tất cả các id tác nhân khả dụng. Trang này cũng cho thấy rằng kết quả ví dụ của bạn thực sự thuộc về IE 7. Thông tin thêm về các trường trong chính id agent có thể được tìm thấy trên this page, nhưng như tôi đã nói, các trình duyệt có xu hướng sử dụng nó cho các lợi ích của riêng nó và nó có thể ở một (hơi) định dạng khác.

0

Tôi nghĩ rằng việc dựa vào userAgent hơi yếu vì nó có thể (và thường) giả.

Nếu bạn muốn phân phát CSS chỉ dành cho IE, hãy sử dụng nhận xét có điều kiện.

<link type="text/css" rel="stylesheet" href="styles.css"/><!--for all--> 
<!--[if IE]> 
    <link type="text/css" rel="stylesheet" href="ie_styles.css"/> 
<![endif]--> 

hoặc nếu bạn chỉ muốn một cho IE6:

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

Kể từ khi một mình bình luận bỏ qua nó bởi các trình duyệt ... trừ IE mà tải nó nếu nếu kiểm tra phù hợp với trình duyệt hiện tại.

+0

Nếu nó giả, ai quan tâm? Nó không giống như bạn đang dựa vào an ninh trên nó, nó chỉ là hiển thị một cái gì đó cho người dùng ... –

2

nếu stripos ($ _ MÁY CHỦ [ 'HTTP_USER_AGENT'], "mozilla")! == false)

Đó không phải là một thử nghiệm hữu ích, hầu hết các trình duyệt xác định bản thân như Mozilla.

là $ _SERVER ['HTTP_USER_AGENT'] một cách đáng tin cậy?

No.

Tôi có nên chọn tham gia chức năng get_browser không?

số

Browser-sniffing trên phía máy chủ là một trò chơi thất bại. Ngoài tất cả các vấn đề cố gắng phân tích chuỗi UA, trình duyệt nằm, trình duyệt tối nghĩa và khả năng tiêu đề không có ở đó, nếu bạn trả lại nội dung trang khác nhau cho một trình duyệt khác, bạn phải đặt tiêu đề Vary để bao gồm User-Agent, nếu không, bộ nhớ đệm proxy có thể trả về phiên bản sai của trang cho trình duyệt không đúng.

Nhưng nếu bạn thêm Vary: User-Agent mã bộ nhớ đệm bị hỏng của IE sẽ bị nhầm lẫn và tải lại trang mỗi lần. Vì vậy, bạn không thể giành chiến thắng.

Nếu bạn phải trình duyệt-sniff, nơi để làm điều đó là ở phía khách hàng, sử dụng JavaScript và, đặc biệt trong trường hợp của IE, ý kiến ​​có điều kiện. Thật may mắn khi đó là IE hỗ trợ các bình luận có điều kiện, vì đó là trình duyệt mà bạn thường cần giải pháp. (Xem câu trả lời của scunliffe cho chiến lược phổ biến nhất.)

6
class Browser { 
    /** 
    Figure out what browser is used, its version and the platform it is 
    running on. 

    The following code was ported in part from JQuery v1.3.1 
    */ 
    public static function detect() { 
     $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

     // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. 
     if (preg_match('/opera/', $userAgent)) { 
      $name = 'opera'; 
     } 
     elseif (preg_match('/webkit/', $userAgent)) { 
      $name = 'safari'; 
     } 
     elseif (preg_match('/msie/', $userAgent)) { 
      $name = 'msie'; 
     } 
     elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) { 
      $name = 'mozilla'; 
     } 
     else { 
      $name = 'unrecognized'; 
     } 

     // What version? 
     if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) { 
      $version = $matches[1]; 
     } 
     else { 
      $version = 'unknown'; 
     } 

     // Running on what platform? 
     if (preg_match('/linux/', $userAgent)) { 
      $platform = 'linux'; 
     } 
     elseif (preg_match('/macintosh|mac os x/', $userAgent)) { 
      $platform = 'mac'; 
     } 
     elseif (preg_match('/windows|win32/', $userAgent)) { 
      $platform = 'windows'; 
     } 
     else { 
      $platform = 'unrecognized'; 
     } 

     return array( 
      'name'  => $name, 
      'version' => $version, 
      'platform' => $platform, 
      'userAgent' => $userAgent 
     ); 
    } 
} 


$browser = Browser::detect(); 
+4

Nói chrome là safari ... –

+0

tại sao bạn tạo một lớp học chỉ với một phương pháp trong đó? tại sao không sử dụng chức năng bình thường thay thế? –

+0

Đó là lựa chọn của bạn theo ý bạn. Tôi đang đưa ra ví dụ về cách phát hiện trình duyệt. Tôi đã lấy từ một trong những dự án làm việc của tôi. Cũng sử dụng các đối tượng là thích hợp hơn cho tất cả các nhà phát triển. – user1524615

53

Kiểm tra mã này, tôi thấy nó hữu ích. Không kiểm tra Mozilla vì hầu hết trình duyệt sử dụng chuỗi này làm chuỗi tác nhân người dùng

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) 
    echo 'Internet explorer'; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) //For Supporting IE 11 
    echo 'Internet explorer'; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== FALSE) 
    echo 'Mozilla Firefox'; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) 
    echo 'Google Chrome'; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== FALSE) 
    echo "Opera Mini"; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE) 
    echo "Opera"; 
elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== FALSE) 
    echo "Safari"; 
else 
    echo 'Something else'; 
+1

Tuyệt vời +1 điều này! –

+4

Không hoạt động cho IE 11 (có một cái nhìn tại đây: http://www.nczonline.net/blog/2013/07/02/internet-explorer-11-dont-call-me-ie/) –

+2

edited @rap -2-h –

1

Bài đăng cũ vẫn xuất hiện trong Google. get_browser() là giải pháp tốt nhất nhưng chỉnh sửa php.ini có thể là không thể. Theo số this post bạn không thể ini_set thuộc tính browscap. Vì vậy, những gì còn lại? phpbrowscap dường như hoàn thành công việc. Các tài liệu này là không lớn vì vậy nếu bạn không muốn nó tự động cập nhật (mặc định là trên), sau đó bạn cần phải thiết lập

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL; 
$bc->localFile = __DIR__ . "/php_browscap.ini"; 
0
Check This Code :  
    <?php  

class OS_BR{  
private $agent = ""; 
private $info = array(); 

function __construct(){ 
    $this->agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : NULL; 
    $this->getBrowser(); 
    $this->getOS(); 
}  
function getBrowser(){  
    $browser = array("Navigator"   => "/Navigator(.*)/i", 
        "Firefox"    => "/Firefox(.*)/i", 
        "Internet Explorer" => "/MSIE(.*)/i", 
        "Google Chrome"  => "/chrome(.*)/i", 
        "MAXTHON"    => "/MAXTHON(.*)/i", 
        "Opera"    => "/Opera(.*)/i", 
        ); 
    foreach($browser as $key => $value){ 
     if(preg_match($value, $this->agent)){ 
      $this->info = array_merge($this->info,array("Browser" => $key)); 
      $this->info = array_merge($this->info,array(
       "Version" => $this->getVersion($key, $value, $this->agent))); 
      break; 
     }else{ 
      $this->info = array_merge($this->info,array("Browser" => "UnKnown")); 
      $this->info = array_merge($this->info,array("Version" => "UnKnown")); 
     } 
    } 
    return $this->info['Browser']; 
} 
function getOS(){ 
    $OS = array("Windows" => "/Windows/i", 
       "Linux"  => "/Linux/i", 
       "Unix"  => "/Unix/i", 
       "Mac"  => "/Mac/i" 
       ); 

    foreach($OS as $key => $value){ 
     if(preg_match($value, $this->agent)){ 
      $this->info = array_merge($this->info,array("Operating System" => $key)); 
      break; 
     } 
    } 
    return $this->info['Operating System']; 
} 

function getVersion($browser, $search, $string){ 
    $browser = $this->info['Browser']; 
    $version = ""; 
    $browser = strtolower($browser); 
    preg_match_all($search,$string,$match); 
    switch($browser){ 
     case "firefox": $version = str_replace("/","",$match[1][0]); 
     break; 

     case "internet explorer": $version = substr($match[1][0],0,4); 
     break; 

     case "opera": $version = str_replace("/","",substr($match[1][0],0,5)); 
     break; 

     case "navigator": $version = substr($match[1][0],1,7); 
     break; 

     case "maxthon": $version = str_replace(")","",$match[1][0]); 
     break; 

     case "google chrome": $version = substr($match[1][0],1,10); 
    } 
    return $version; 
} 

function showInfo($switch){ 
    $switch = strtolower($switch); 
    switch($switch){ 
     case "browser": return $this->info['Browser']; 
     break; 

     case "os": return $this->info['Operating System']; 
     break; 

     case "version": return $this->info['Version']; 
     break; 

     case "all" : return array($this->info["Version"], 
      $this->info['Operating System'], $this->info['Browser']); 
     break; 

     default: return "Unkonw"; 
     break; 

    } 
} 
}  


$obj = new OS_BR(); 

echo $obj->showInfo('browser'); 

echo $obj->showInfo('version'); 

echo $obj->showInfo('os'); 

echo "<pre>".print_r($obj->showInfo("all"),true)."</pre>"; 

?> 
2

User Agent có thể được làm giả và nó tốt hơn không phụ thuộc vào chuỗi tác nhân người dùng thay vì sau đó bạn có thể sử dụng truy vấn phương tiện CSS3 nếu bạn chỉ muốn phát hiện định hướng (bạn có thể khám phá CSS của khung khởi động đáp ứng nổi tiếng để kiểm tra cách bạn có thể xử lý phần định hướng bằng CSS)

Ở đây là ít CSS:

@media only screen and (max-width: 999px) { 
    /* rules that only apply for canvases narrower than 1000px */ 
    } 

    @media only screen and (device-width: 768px) and (orientation: landscape) { 
    /* rules for iPad in landscape orientation */ 
    } 

    @media only screen and (min-device-width: 320px) and (max-device-width: 480px) { 
    /* iPhone, Android rules here */ 
    }  

Read more: About CSS orientation detection

HOẶC Bạn có thể tìm ra hướng sử dụng JavaScript:

// Listen for orientation changes 
    window.addEventListener("orientationchange", function() { 
     // Announce the new orientation number 
     alert(window.orientation); 
    }, false); 

Read more: About detect orientation using JS

Cuối cùng nếu bạn thực sự muốn đi với chuỗi tác nhân người dùng sau đó mã này sẽ giúp bạn rất nhiều, hoạt động tốt trên hầu hết mọi trình duyệt:

<?php 
class BrowserDetection { 

    private $_user_agent; 
    private $_name; 
    private $_version; 
    private $_platform; 

    private $_basic_browser = array (
     'Trident\/7.0' => 'Internet Explorer 11', 
    'Beamrise' => 'Beamrise', 
    'Opera' => 'Opera', 
    'OPR' => 'Opera', 
    'Shiira' => 'Shiira', 
    'Chimera' => 'Chimera', 
    'Phoenix' => 'Phoenix', 
    'Firebird' => 'Firebird', 
    'Camino' => 'Camino', 
    'Netscape' => 'Netscape', 
    'OmniWeb' => 'OmniWeb', 
    'Konqueror' => 'Konqueror', 
    'icab' => 'iCab', 
    'Lynx' => 'Lynx', 
    'Links' => 'Links', 
    'hotjava' => 'HotJava', 
    'amaya' => 'Amaya', 
    'IBrowse' => 'IBrowse', 
    'iTunes' => 'iTunes', 
    'Silk' => 'Silk', 
    'Dillo' => 'Dillo', 
    'Maxthon' => 'Maxthon', 
    'Arora' => 'Arora', 
    'Galeon' => 'Galeon', 
    'Iceape' => 'Iceape', 
    'Iceweasel' => 'Iceweasel', 
    'Midori' => 'Midori', 
    'QupZilla' => 'QupZilla', 
    'Namoroka' => 'Namoroka', 
    'NetSurf' => 'NetSurf', 
    'BOLT' => 'BOLT', 
    'EudoraWeb' => 'EudoraWeb', 
    'shadowfox' => 'ShadowFox', 
    'Swiftfox' => 'Swiftfox', 
    'Uzbl' => 'Uzbl', 
    'UCBrowser' => 'UCBrowser', 
    'Kindle' => 'Kindle', 
    'wOSBrowser' => 'wOSBrowser', 
    'Epiphany' => 'Epiphany', 
    'SeaMonkey' => 'SeaMonkey', 
    'Avant Browser' => 'Avant Browser', 
    'Firefox' => 'Firefox', 
    'Chrome' => 'Google Chrome', 
    'MSIE' => 'Internet Explorer', 
    'Internet Explorer' => 'Internet Explorer', 
    'Safari' => 'Safari', 
    'Mozilla' => 'Mozilla' 
    ); 

    private $_basic_platform = array(
     'windows' => 'Windows', 
    'iPad' => 'iPad', 
     'iPod' => 'iPod', 
    'iPhone' => 'iPhone', 
    'mac' => 'Apple', 
    'android' => 'Android', 
    'linux' => 'Linux', 
    'Nokia' => 'Nokia', 
    'BlackBerry' => 'BlackBerry', 
    'FreeBSD' => 'FreeBSD', 
    'OpenBSD' => 'OpenBSD', 
    'NetBSD' => 'NetBSD', 
    'UNIX' => 'UNIX', 
    'DragonFly' => 'DragonFlyBSD', 
    'OpenSolaris' => 'OpenSolaris', 
    'SunOS' => 'SunOS', 
    'OS\/2' => 'OS/2', 
    'BeOS' => 'BeOS', 
    'win' => 'Windows', 
    'Dillo' => 'Linux', 
    'PalmOS' => 'PalmOS', 
    'RebelMouse' => 'RebelMouse' 
    ); 

    function __construct($ua = '') { 
     if(empty($ua)) { 
      $this->_user_agent = (!empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT')); 
     } 
     else { 
      $this->_user_agent = $ua; 
     } 
     } 

    function detect() { 
     $this->detectBrowser(); 
     $this->detectPlatform(); 
     return $this; 
    } 

    function detectBrowser() { 
    foreach($this->_basic_browser as $pattern => $name) { 
     if(preg_match("/".$pattern."/i",$this->_user_agent, $match)) { 
      $this->_name = $name; 
      // finally get the correct version number 
      $known = array('Version', $pattern, 'other'); 
      $pattern_version = '#(?<browser>' . join('|', $known).')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#'; 
      if (!preg_match_all($pattern_version, $this->_user_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($this->_user_agent,"Version") < strripos($this->_user_agent,$pattern)){ 
        @$this->_version = $matches['version'][0]; 
       } 
       else { 
        @$this->_version = $matches['version'][1]; 
       } 
      } 
      else { 
       $this->_version = $matches['version'][0]; 
      } 
      break; 
     } 
     } 
    } 

    function detectPlatform() { 
     foreach($this->_basic_platform as $key => $platform) { 
      if (stripos($this->_user_agent, $key) !== false) { 
       $this->_platform = $platform; 
       break; 
      } 
     } 
    } 

    function getBrowser() { 
     if(!empty($this->_name)) { 
      return $this->_name; 
     } 
    }   

    function getVersion() { 
     return $this->_version; 
    } 

    function getPlatform() { 
     if(!empty($this->_platform)) { 
      return $this->_platform; 
     } 
    } 

    function getUserAgent() { 
     return $this->_user_agent; 
    } 

    function getInfo() { 
     return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" . 
     "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" . 
     "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" . 
     "<strong>Platform:</strong> {$this->getPlatform()}<br/>"; 
    } 
} 

$obj = new BrowserDetection(); 

echo $obj->detect()->getInfo(); 

Mã trên hoạt động s cho tôi gần như trên mọi trình duyệt và tôi hy vọng nó sẽ giúp bạn một chút.

+1

oh boy nhưng bạn thậm chí không biết những gì anh ta muốn làm với thông tin đó và đi cho thấy các truy vấn phương tiện truyền thông ... – user151496

Các vấn đề liên quan