not - php user agent




用php可靠的用戶瀏覽器檢測 (6)

如果stripos($ _ SERVER ['HTTP_USER_AGENT'],“mozilla”)!== false)

這不是一個有用的測試,幾乎每個瀏覽器都將自己標識為Mozilla。

$ _SERVER ['HTTP_USER_AGENT']是一種可靠的方式嗎?

沒有。

我應該選擇get_browser函數嗎?

沒有。

瀏覽器在服務器端嗅探是一場失敗的遊戲。 除了嘗試解析UA字符串,瀏覽器,瀏覽器以及標題根本不存在的可能性之外的所有問題,如果為不同的瀏覽器返回不同的頁面內容,則必須設置Vary標題包括User-Agent ,否則緩存代理可能會將錯誤的頁面版本返回到錯誤的瀏覽器。

但是如果你添加Vary: User-Agent IE的破解緩存代碼會混淆並每次重新加載頁面。 所以你不能贏。

如果你必須瀏覽器嗅探,那麼在客戶端使用JavaScript,特別是在IE的情況下,有條件的註釋。 幸運的是它支持條件評論的IE,因為這是你經常需要解決方法的瀏覽器。 (參見scunliffe對最常見策略的回答。)

試圖用PHP檢測用戶的瀏覽器,$ _SERVER ['HTTP_USER_AGENT']是一種可靠的方法嗎? 我應該選擇get_browser函數嗎? 您找到哪一個會帶來更精確的結果?

如果這種方法是實用的,那麼建議使用它來輸出相關的CSS鏈接,例如:

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

我注意到了這個問題 ,但我想澄清這是否適合面向CSS的檢測。

更新:真的很可疑:我試過echo $_SERVER['HTTP_USER_AGENT']; 在IE 7上,這是它的輸出:

Mozilla / 4.0(兼容; 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也給了“mozilla”一些奇怪的東西。 是什麼賦予了?


@Ekramul Hoque走在正確的軌道上,但他的答案有幾個缺陷。

首先,我將從Edge開始,因為Internet Explorer在其任何UA中都不包含術語Edge

if(strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

然後,繼續向後工作,因為早期版本的IE沒有使用Trident引擎,因此不會在其UA中包含它。

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

我們需要接下來的iOS瀏覽器,以便後續查詢不會干擾這個。 除了Opera Mini之外,所有iOS瀏覽器都使用webkit,後者從遠程服務器而不是設備進行渲染。 這意味著我們可以使用iOS定位UA中的操作系統,並排除包含Opera UA。

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iOS') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE {
  echo '<link type="text/css" href="webkit.css" />';

接下來,轉到Firefox瀏覽器。 雖然使用Firefox進行搜索,但它只能識別Firefox瀏覽器 - 而不是基於Firefox的瀏覽器。 Firefox在其UA中包含Gecko ,因為Gecko是它使用的引擎,因此我們可以將其作為目標。 通過使用Gecko ,我們可以識別在Gecko引擎上運行的所有瀏覽器(即SeaMonkey)。 但是,由於兼容性原因,許多瀏覽器使用like Gecko這樣的術語,所以我們必須確保匹配Gecko而不是like Gecko

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') && !strpos($_SERVER['HTTP_USER_AGENT'], 'like Gecko') !== FALSE) {
  echo '<link type="text/css" href="moz.css" />';

繼續我們將識別Opera瀏覽器。 Opera使用Presto引擎到v12結束。 從v15開始,他們開始使用像Chrome這樣的Blink引擎。 v12和更早版本在UA中包含了v15 +沒有的兩個獨特單詞 - OperaPresto 。 您可以將它們中的任何一個定位,因為它們始終在一起。 對於第15版,Opera開始在UA中使用OPR

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Presto') !== FALSE) {
  echo '<link type="text/css" href="o.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'OPR') !== FALSE) {
  echo '<link type="text/css" href="normal.css" />';

接下來是Safari。 Safari使用AppleWebKit作為其渲染引擎,但我們不能僅僅將其作為目標,因為出於兼容性原因,Chrome還在其UA中同時包含AppleWebKitSafari 。 因此,我們需要搜索AppleWebKit而不是Chrome

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'AppleWebKit') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
  echo '<link type="text/css" href="webkit.css" />';

最後,我們訪問Chrome。 Chrome使用AppleWebKit直到v27。 隨著v28發布,他們切換到Blink引擎。 我們可以針對兩個引擎,但需要大量代碼。 由於Chrome現在幾乎達到了V70,我們只會搜索Chrome因為任何人都不太可能還在運行Chrome的webkit版本。

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE {
  echo '<link type="text/css" href="normal.css" />';

最後但並非最不重要的是,你的後備/其他。

} else {
  echo '<link type="text/css" href="normal.css" />';
}

現在,我在這裡使用引用供應商前綴的css文件來定位。 隨意根據需要調整它,讓它做你需要它做的事情。 我希望這有幫助。


我認為依賴於userAgent有點弱,因為它可以(並且經常)偽造。

如果您只想為IE提供CSS,請使用條件註釋。

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

或者如果你只想要一個IE6:

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

由於它的評論被瀏覽器忽略了......除了IE加載它,如果if測試與當前瀏覽器匹配。


檢查這段代碼,我發現這很有用。 不要檢查Mozilla,因為大多數瀏覽器都將此用作用戶代理字符串

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';

老帖子仍然出現在谷歌。 get_browser()是最好的解決方案,但編輯php.ini可能是不可能的。 根據這篇文章,你不能ini_set browscap屬性。 那剩下什麼了? phpbrowscap似乎完成了工作。 文檔不是很好,所以如果你不想讓它自動更新(默認打開),那麼你需要設置

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL;
$bc->localFile = __DIR__ . "/php_browscap.ini";

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>"; 

 ?>






browser-detection