Statistika přístupů v PHP – detekce prohlížeče

17. ledna 2004

V tomto článku si ukážeme, jak zjistit název a verzi prohlížeče, eventuelně i nadstavbu, kterou návštěvník společně s prohlížečem používá. Mimo jiné se dozvíte i to, jak se používají regulární výrazy v SQL dotazech.

Hotovou aplikaci si jako obvykle můžete prohlédnout a vyzkoušet. V této ukázkové verzi se provádí statistika přístupů stránek http://www.czechia.cz/help/

Údaje o prohlížeči budeme zjišťovat z proměnné $_SERVER['HTTP_USER_AGENT'] obsahující hlavičku User-Agent, ve které prohlížeč posílá obvykle svůj název, verzi a informaci o platformě, na které běží.

Pro získání konkrétních informací z hlavičky $_SERVER[‚HTTP_USER_AGENT‘] můžeme použít minimálně dva postupy. Samotné PHP obsahuje funkci Get_Browser() (viz PHP manuál), která dokáže z hlavičky User-Agent zjistit celou řadu údajů. Množství a správnost získaných údajů záleží na obsahu souboru browscap.ini. Tento soubor, který je obsažen v instalaci PHP, byl však naposledy aktualizován 1. října 2000, a proto neobsahuje údaje o nových prohlížečích jako jsou IE 6, Opera 7 a další. Pokud si nechcete soubor browscap.ini aktualizovat sami, je tato metoda prakticky nepoužitelná.

Tím druhým způsobem je „ruční“ zjištění potřebných údajů. Provádí se tak, že se hlavička User-Agent postupně porovnává s několika regulárními výrazy, čímž se zjistí žádaná informace. Na první pohled to vypadá celkem jednoduše, ale přesto mohou nastat určité komplikace. Dobře to ilustruje následující tabulka:

Prohlížeč Příklad hlavičky
Opera 3 Mozilla/4.71 (Windows 95;US) Opera 3.62 [en]
Opera 6 Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]
Opera 6 Opera/6.0 (Windows 98; U) [en]
MSIE 3 Mozilla/2.0 (compatible; MSIE 3.0; Windows 95)
MSIE 4 Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)
MSIE 5 Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; MyIE2 0.3)
MSIE 6 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; NetCaptor 7.1.0)
Konqueror Mozilla/5.0 (compatible; Konqueror/2.1 Beta 2; X11)
iCab Mozilla/4.5 (compatible; iCab Pre2.2; Macintosh; I; PPC)
Netscape 4.0 Mozilla/4.03 [en] (WinNT; U)
Netscape 4.5 Mozilla/4.51 [cs] (Win98; I)
Netscape 6 Mozilla/5.0 (Windows; U; Win98;) Gecko/20001108 Netscape6/6.0
Mozilla 0.9 Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122

Z tabulky jasně vyplývá, že při detekci browseru musíme dodržet určité pořadí. Proč? Tak například hlavička, kterou se představuje Opera 6, obsahuje někdy i text MSIE 5.0. Detekci prohlížečů Opera proto musíme provést dříve, než detekci MSIE. Pro browsery firmy Netscape je klíčový začátek hlavičky – Mozilla/_verze_ následovaný v závorce znakem U nebo I (označuje míru zabezpečení). Takto se však hlásí i některé další prohlížeče, proto se detekce prohlížečů Netscape provede až na samém konci. Pro prohlížeče Mozilla a příbuzné (například Mozilla Firebird nebo Camino) je typický začátek Mozilla/5.0 a v závorce poté rv:_verze_. Výsledné pořadí detekce tedy vypadá takto: 1. Opera, 2. MSIE, 3. ostatní prohlížeče, 4. Netscape/Mozilla.

Nyní máme dvě možnosti, jak zjistit informace o prohlížeči. Pomocí funkcí pro práci s regulárními výrazy můžeme zjistit vše přímo ve skriptu. Druhý způsob spočívá v tom, že regulární výrazy a jména prohlížečů uložíme do databáze a detekci provedeme pomocí SQL dotazu.

Já jsem zvolil druhý způsob, který umožňuje pohodlnou editaci regulárních výrazů i názvů prohlížečů. Navíc můžeme do databáze snadno přidávat nové prohlížeče.

Tabulka „browser“

Výše zmíněné informace budeme uchovávat v tabulce browser, kterou vytvoříme pomocí tohoto SQL dotazu:

CREATE TABLE browser (
  id int(11) NOT NULL,
  name varchar(50) NOT NULL,
  browser_regexp varchar(70) NOT NULL ,
  PRIMARY KEY (id)
);

  • id – unikátní označení každého prohlížeče (primární klíč)
  • name – název a verze prohlížeče
  • browser_regexp – regulární výraz detekující daný prohlížeč

V záznamu s id = 0 je text označující jiné a nezjištěné prohlížeče. Poté musíme dodržet pořadí, které jsme si před chvílí definovali. Od id = 1 to budou prohlížeče Opera, od 51 IE, od 101 ostatní prohlížeče, od 201 Netscape/Mozilla.

Pro utváření regulárních výrazů v SQL platí stejná pravidla jako pro regulární výrazy v PHP. Jen připomenu, že metaznak „.“ označuje jeden libovolný znak. Toho využijeme, protože například Opera 6 se může hlásit textem Opera 6.0 nebo Opera/6.0. Metaznak „.“ vložíme i do všech mezer, protože někdy jsou mezery v hlavičce User-Agent nahrazeny znakem „+“ (Mozilla/4.0+(compatible;+MSIE+5.5;+Windows+98)). Pokud chceme použít metaznak v jeho původním významu, musíme před něj vložit zpětné lomítko, znak „\“. Regulární výraz, detekující MSIE 5.5, pak vypadá takto: msie.5\.5.

Pokud byste chtěli vědět, jak moc a jak často kontrolují vaše stránky různé vyhledávače a roboti, můžete si je též přidat do tabulky browser. Hlavičky mnoha vyhledávačů lze najít na stránkách uvedených na konci článku.

id name browser_regexp
0 Jiný, nezjištěno  
1 Opera 2 opera.2
2 Opera 3 opera.3
3 Opera 4 opera.4
4 Opera 5 opera.5
5 Opera 6 opera.6
6 Opera 7.0 opera.7\.0
7 Opera 7.1 opera.7\.1
8 Opera 7.2 opera.7\.2
40 Opera (ostatní) opera
51 IE PDA ie.*windows.ce
52 IE 1 msie.1
53 IE 2 msie.2
54 IE 3 msie.3
55 IE 4 msie.4
56 IE 5 msie.5\.0
57 IE 5.5 msie.5\.5
58 IE 6 msie.6
101 iCab icab
102 amaya amaya
103 Lynx lynx
104 Konqueror konqueror
105 Lotus lotus
106 Links links .
107 Mosaic mosaic
108 OmniWeb omniweb
109 Safari safari
110 AvantGo avantgo
111 Nautilus nautilus
112 Galeon galeon
201 Netscape 1 mozilla/1.*;.(I|U)(;|\))
202 Netscape 2 mozilla/2.*;.(I|U)(;|\))
203 Netscape 3 mozilla/3.*;.(I|U)(;|\))
204 Netscape 4 mozilla/4.*;.(I|U)(;|\))
205 Netscape 6 netscape.?6
206 Netscape 7 netscape.?7
231 Mozilla 0.9 mozilla/5.*rv:0.9
232 Mozilla 1.0 mozilla/5.*rv:1.0
233 Mozilla 1.1 mozilla/5.*rv:1.1
234 Mozilla 1.2 mozilla/5.*rv:1.2
235 Mozilla 1.3 mozilla/5.*rv:1.3
236 Mozilla 1.4 mozilla/5.*rv:1.4
237 Mozilla 1.5 mozilla/5.*rv:1.5
238 Mozilla 1.6 mozilla/5.*rv:1.6
280 Mozilla (zbytek) mozilla/5.*;.(I|U)(;|\)).*gecko

Nyní již můžeme sestavit SQL dotaz, který zjistí, o jaký prohlížeč se jedná. Ještě předtím převedeme obsah hlavičky User-Agent na malá písmena. SQL dotaz vypadá takto:

SELECT id FROM browser WHERE ‚$http_user_agent‘ REGEXP browser_regexp ORDER BY id LIMIT 0,1

Pro snazší pochopení použitý SQL dotaz postupně rozeberu. Z tabulky browser vybíráme pouze id prohlížeče. Následuje podmínka, ve které porovnáváme hlavičku $http_user_agent s regulárními výrazy v databázi. K tomu slouží příkaz REGEXP. Před ním se uvádí hledaný řetězec, za ním regulární výraz. Příkaz ORDER BY id musíme použít, aby bylo dodrženo stanovené pořadí detekce jednotlivých typů prohlížečů. Na závěr pomocí příkazu LIMIT 0,1 omezíme výběr pouze na jeden záznam. Může se totiž stát, že hlavička odpovídá několika regulárním výrazům (viz první tabulka). Nás však zajímá jen první záznam.

Pokud se prohlížeč nepodařilo identifikovat, vložíme do proměnné $browser hodnotu „0“. Tato proměnná poté bude součástí SQL dotazu, který přidá do tabulky access veškeré informace o konkrétním přístupu.

$http_user_agent = strtolower($_SERVER[‚HTTP_USER_AGENT‘]);
// BROWSER
$query = mysql_query(„SELECT id FROM browser WHERE ‚$http_user_agent‘ REGEXP browser_regexp ORDER BY id LIMIT 0,1“);
if ($result = mysql_fetch_array($query))
  $browser = $result[‚id‘];
else
  $browser = 0;

Nadstavby prohlížečů

V poslední době si řada lidí přidává ke svým prohlížečům různé nadstavby, které dokáží prohlížeč často velmi podstatným způsobem vylepšit. U Internet Exploreru patří k těm nejpoužívanějším NetCaptor nebo MyIE2. Za určitý typ nadstavby se dají považovat i prohlížeče Mozilla Firebird nebo Camino (dříve Chimera), které jsou sice distribuovány zcela samostatně, ale vycházejí ze společného jádra Mozilla/Gecko.

Informace o těchto nadstavbách se dají také získatz hlavičky User-Agent (viz první tabulka). Postup, jakým budeme zjišťovat používanou nadstavbu, je velmi podobný detekci prohlížeče. Vytvoříme tabulku browser_add_on s podobnou vazbou na tabulku access a do ní vložíme informace stejného typu jako do tabulky browser.

CREATE TABLE browser_add_on (
  id int(11) NOT NULL auto_increment,
  name varchar(50) NOT NULL,
  add_on_regexp varchar(30) NOT NULL,
  PRIMARY KEY (id)
)

  • id – unikátní označení každé nadstavby (primární klíč)
  • name – název nadstavby
  • add_on_regexp – regulární výraz detekující danou nadstavbu

id name add_on_regexp
1 NetCaptor netcaptor
2 HotBar hotbar
3 Crazy Browser crazy.browser
4 Net Manager net.m@nager
5 Girafa girafabot
6 MSN msn
7 AOL aol
8 NetComplete netcomplete
9 MyIE2 myie2
10 Alexa Toolbar alexa.toolbar
11 Avant Browser avant.browser
12 Firebird firebird
13 Phoenix phoenix
14 Chimera chimera
15 Camino camino
16 K-Meleon k-meleon

Zcela analogicky probíhá i detekce. Obsah proměnné $browser_add_on na závěr vložíme do tabulky access, do sloupečku brow_add_on.

// BROWSER – nadstavba
$query = mysql_query(„SELECT id FROM browser_add_on WHERE ‚$http_user_agent‘ REGEXP add_on_regexp ORDER BY id LIMIT 0,1“);
if ($result = mysql_fetch_array($query))
  $browser_add_on = $result[‚id‘];
else
  $browser_add_on = 0;

To by bylo pro tentokrát vše. V dalším článku bude řeč o detekci operačních systémů a také se dozvíte, jak provést vyhodnocení údajů o prohlížečích, jejich nadstavbách a operačních systémech.

Odkazy, zdroje

Pozn. red.: Tento článek vyšel poprvé 23. 5. 2002. Původní verze článku a k němu vedené diskuse jsou vám k dispozici v ZIP archivech.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek zsvp
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *