Poměrně často řešíme situaci, kdy jeden projekt přesahuje více než jednu doménu. V momentě, kdy máme na výběr, je z hlediska vyhodnocování jednodušší, pokud projekt udržíme na subdoménách jediné domény druhého řádu. Díky možnosti nastavit First-Party Cookie s ID návštěvníka pro celou doménu tak lze sledovat jeho pohyb na všech měřených webech. Jako bonus ušetříme na SSL certifikátech. Ať už z důvodů historických, marketingových či technologických ale tuto možnost často nemáme.

Jak tedy nastalou situaci řešit

Nejjednodušší variantou řešení je využití Third-Party Cookie. Ponechme nyní stranou téměř filosofické debaty o správnosti takového počínání (a nutnosti o takovém měření návštěvníky vhodné informovat). Ignorujme i nižší přesnost dat vlivem nepříliš často využívané možnosti zákazu takových Cookies. Spokojme se s faktem, že podstatná část naší návštěvnosti takto změřena bude.

Volba vhodné domény

Zde lze jít z hlediska ochrany soukromí přijatelnější cestou a zvolit alespoň jednu z domén, která je součástí našeho projektu (optimálně tu nejnavštěvovanější nebo takovou, která je nejčastěji využívána jako vstupní). Cookie s ID návštěvníka tak má větší šanci, že vznikne jako First-Party. Tento způsob je částečně posvěcen též výrobci prohlížečů – jmenovitě Apple a o podobné variantě uvažovala též Mozilla, ale nakonec ji ponechala pouze jako volbu v nastavení. Takovou Cookie pak prohlížeče posílají i na doménách vůči nimž je již v danou chvíli Third-Party. Na této doméně pak zřídíme pro naše Visitor API subdoménu či specifickou cestu.

Zajištění spuštění serverového kódu

Naše Visitor API bude jednoduchý dynamický skript na zvolené doméně. Je proto ale nutné zajistit, aby se zvolená URL mapovala na serverový kód, který realizuje potřebnou funkčnost (v příkladu je cesta k souboru vid.js, ale server tento požadavek zpracovává PHP souborem po přesměrování přes .htaccess). V případě, že má API fungovat též na HTTPS, je vhodné skript vkládat s Protocol Relative URL a je nutné na dané doméně nasadit SSL certifikát.

<script type="text/javascript" src="//vidapi.mojedomena.cz/vid.js"></script>

Logika serverového kódu Visitor API

Dalším krokem je vytvoření kódu, který zajistí požadovanou funkčnost. Pro jednoduchost volím k praktickým ukázkám PHP, protože věřím, že na úrovni pochopení kódu poslouží nejširšímu publiku (zároveň prosím o shovívavost – nejsem PHP vývojář).

<?php
$expire = time() + 60 * 60 * 24 * 365 * 5;
$domain = ".mojedomena.cz";
$redir = $_SERVER["QUERY_STRING"] !== "" ? strpos("n=1", $_SERVER["QUERY_STRING"]) !== false : false;
if (!isset($_COOKIE["vid"])) { // unidentified visitor
    if (!$redir) {
        setcookie("vid", sha1(openssl_random_pseudo_bytes(32)), $expire, "/", $domain);
        header('Location: ' . $_SERVER["REQUEST_URI"] . "?n=1");
        die();
    } else {
        echo "var VisitorAPI = {vid: \"\"}\n";
    }
} else { // identified visitor
    setcookie("vid", $_COOKIE["vid"], $expire, "/", $domain);
    echo "var VisitorAPI = {vid: \"". $_COOKIE["vid"] . "\", isNew: " . ($redir ? "false" : "true") . "\n}";
}
?>

Rozeberme si kód po částech.

Základní nastavení

$expire = time() + 60 * 60 * 24 * 365 * 5;
$domain = ".mojedomena.cz";
$redir = $_SERVER["QUERY_STRING"] !== "" ? strpos("n=1", $_SERVER["QUERY_STRING"]) !== false : false;

Tato část kódu definuje společné parametry nastavení naší Visitor ID Cookie a detekuje, zda jde o původní, či redirectovanou URL (viz dále).

Větev kódu pro neidentifikovaného návštěvníka

Nejprve dojde k vygenerování unikátního řetězce (sha1(openssl_random_pseudo_bytes(32))) a k pokusu o nastavení Cookie s expirací 5 let. K tomu dochází díky HTTP hlavičce Set-Cookie v tomto případě nastavené PHP funkcí setcookie. Ta ale Cookie teprve nastavuje a pro její čtení je tedy nutné provést ještě redirect „sama na sebe“. K URL navíc přidáme parametr (?n=1), abychom poznali, že se jedná o redirectovaný požadavek. Pokud nemá návštěvník po redirectu nastavenou Visitor ID Cookie, pravděpodobně prohlížeč nastavení Cookie nepovoluje. Pak jako Visitor ID vrací prázdný řetězec a je k identifikaci návštěvníka nutné využít jiný údaj (to zde již řešeno není).

if (!$redir) {
    setcookie("vid", sha1(openssl_random_pseudo_bytes(32)), $expire, "/", $domain);
    header('Location: ' . $_SERVER["REQUEST_URI"] . "?n=1");
    die();
} else {
    echo "var VisitorAPI = {vid: \"\"}\n";
}

Větev kódu pro známého návštěvníka

Pokud již Cookie nastavena je, prodlouží API její expiraci a vrací fragment JavaScriptu, který nastavuje globální proměnnou s Visitor ID.

setcookie("vid", $_COOKIE["vid"], $expire, "/", $domain);
echo "var VisitorAPI = {vid: \"". $_COOKIE["vid"] . "\", isNew: " . ($redir ? "false" : "true") . "\n}";

Shrnutí

Tento příklad ukazuje, že sledování návštěvníků po vlastních doménách nemusí být jednoduchý úkol. Ne všechny nástroje tuto problematiku umí řešit automaticky, tento návod vás proto může inspirovat k převzetí iniciativy. Budu rád za jakákoliv doplnění, dotazy či komentáře.

Další souvislosti

Manuál předpokládá využití této metody ke sledování anonymních unikátních návštěvníků (prohlížečů) napříč vlastními doménami. Neuvažuje prozatím situaci, kdy se návštěvník identifikuje (registrace/přihlášení). Pro tento účel by bylo vhodné API rozšířit o databázi vygenerovaných anonymních unikátních ID a možnost připojit k nim reálná ID uživatelů. Dotaz na ID by pak v parametru obsahoval vždy i reálné ID přihlášeného uživatele a API by zpět zaslalo původní vygenerované ID. Zde může nastat situace, kdy uživatel na různých zařízení dostane různá anonymní ID a později se na nich identifikuje – v takovém případě nelze tuto informaci (alespoň v Google či Adobe Analytics) prozatím optimálně zpracovat, protože by byl nutný zásah do již zpracovaných dat (sloučení dvou historicky změřených anonymních unikátních uživatelů do jednoho reálného). Servírovat ale takovému uživateli např. jeho první vygenerované anonymní ID lze považovat za celkem rozumný kompromis. Dále je rozumné zvážit použití HTTP hlavičky P3P, která deklaruje, že jsme obeznámení s principy ochrany osobních údajů konsorcia W3C a dodržujeme je. Toto je vhodné doplnit o zveřejnění Privacy Policy, kde specifikujeme, jak s nasbíranými daty zacházíme a jak je možné v případě nesouhlasu návštěvníka sledování zabránit.

header('P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID PSA OUR IND COM NAV STA"');

Tato hlavička může být některými prohlížeči v určité konfiguraci vyžadována, aby bylo povoleno založení Third-Party Cookie.

Napsat komentář

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