php ile güvenilir bir kullanıcı tarayıcı algılama

4 Cevap php

PHP ile bir kullanıcının tarayıcı algılamak için çalışıyor sadece, $ _SERVER ['HTTP_USER_AGENT'] güvenilir bir yoldur? Ben bunun yerine get_browser fonksiyonu için tercih etmeliyim? hangisini buluyorsunuz daha kesin sonuçlar getiriyor?

Bu yöntem, pragmatik ise, hasta örneğin, ilgili CSS bağlantıları çıkış için kullanmak tavsiye edilir:

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

I this question, ancak ben bu CSS-odaklı tespiti için iyi olup olmadığını açıklamak istedim fark ettim.

UPDATE: something really suspicious: I tried echo $_SERVER['HTTP_USER_AGENT']; on IE 7 and this is what it output:

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 içinde de "mozilla" ile garip bir şey verdi. Ne verir?

4 Cevap

O (daha iyi) desteği ve yeni sürümleri ile güncellenmiş olacak beri varolan bir yöntemi (yani get_browser ) kullanarak, muhtemelen bir şey kendinizi yazmaktan daha iyidir. Orada güvenilir bir şekilde tarayıcı id almak için de kullanılabilir kütüphaneler olabilir.

Decoding the $_SERVER['HTTP_USER_AGENT'] is difficult, since a lot of browsers have quite similar data and tend to (mis)use it for their own benefits. But if you really want to decode them, you could use the information on this page for all available agent ids. This page also shows that your example output indeed belongs to IE 7. More information about the fields in the agent id itself can be found on this page, but as I said already browsers tend to use it for their own benefits and it could be in a (slightly) other format.

Ben UserAgent güvenerek olabildiğince biraz zayıf (ve) çoğunlukla sahte düşünüyorum.

Sadece IE için CSS kadar hizmet etmek istiyorsanız, bir koşullu yorum kullanı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]-->

ya da sadece IE6 için bir isterseniz:

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

Onun bir yana eğer testi mevcut tarayıcınızda eşleşen varsa bunu yükler IE dışında ... onun tarayıcılar tarafından göz ardı comment.

stripos ($ _SERVER ['HTTP_USER_AGENT'], "mozilla")! == false)

Yani hemen hemen her tarayıcı Mozilla olarak kendini tanımlayan, yararlı bir test değil.

$ _SERVER ['HTTP_USER_AGENT'] güvenilir bir yoldur?

Hayır.

Ben yerine get_browser fonksiyonu için tercih etmeliyim?

Hayır.

Tarayıcı-koklama sunucu tarafında bir kaybetme oyunudur. Ayrı başlık farklı bir tarayıcı için farklı sayfa içeriği dönmek eğer {[ayarlamanız gerekir, hiç olmadığı UA dize, karanlık tarayıcılar yalan tarayıcılar ve imkanı ayrıştırmak çalışırken tüm konulardan (0)]} başlığı, User-Agent dahil aksi önbelleğe vekiller yanlış tarayıcıya sayfanın yanlış sürümü iade edebilir.

Eğer eklerseniz Vary: User-Agent IE kırık önbelleğe alma kod şaşkın ve sayfa her zaman yükler alır. Yani kazanmak değil.

Eğer tarayıcı-sniff gerekiyorsa, bunu yapmak için yer JavaScript ve özellikle IE durumunda, koşullu yorum kullanarak, istemci tarafında. Bu sık sık için geçici çözümler ihtiyaç tek bir tarayıcı var çünkü, bu koşullu yorum destekler IE olduğunu şanslı. (En yaygın strateji için scunliffe cevabını bakın.)

Eski sonrası hala Google çıkageldi. get_browser () en iyi çözümdür ama düzenleme php.ini imkansız olabilir. Göre this post Eğer browscap özelliği ini_set olamaz. Peki ne kaldı? phpbrowscap işi gibi görünüyor. Docs büyük değildir bu yüzden otomatik güncelleme (varsayılan açık) onu istemiyorsanız, o zaman ayarlamanız gerekir

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