Statistika přístupů v PHP – detekce prohlížeče
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
- Studená válka prohlížečů – mimo jiné i více informací o nadstavbách prohlížečů
- Internet Explorer 7 se jmenuje MyIE2 – úvodní článek série o nadstavbě MyIE2 od Petra Weidy
- Úplný přehled WWW prohlížečů – sepsal Petr Staníček (v roce 2001)
- Vybíráme internetový prohlížeč: zapomeňte na Explorer! – o prohlížečích na Živě
- Browser archive – informace o několika desítkách prohlížečů včetně možnosti stažení
- List of User-Agents – výborný přehled „User-Agentů“ (vyhledávací roboti, prohlížeče)
- RFC 2616 – kapitola 14.43 obsahuje kratičkou zmínku o hlavičce User-Agent
- User Agents – více než deset tisíc různých hlaviček User-Agent
- Web User Agents Listing and Descriptions – podrobně rozebírá hlavičku User-Agent u nejrozšířenějších prohlížečů
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.
Mohlo by vás také zajímat
-
Jak lze snadno upravovat soubory v PDF?
14. září 2023 -
Nepodceňte UX na vašem webu: Proč na něm záleží?
10. dubna 2024 -
Proč investovat do nejvýkonnějších VPS s AMD EPYC procesory
14. června 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024