Google Analytics, P3P, iframes, Internet Explorer en cookies

ie7Wat hebben deze termen met elkaar gemeen? Dat de combinaties van de laatste 3 vaak problemen opleveren voor een Google Analytics meting. En de 2de term een onderdeel is van de oplossing.

Dit zijn de problemen:

  • Google Analytics cookies doorgeven aan een (i)frame
  • Cookies in (i)frames met inhoud van externe domeinen worden geblokkeerd in Internet Explorer

Google Analytics, frames en iframes

Om op een goede manier het bezoek binnen een frame te meten moeten er een aantal zaken in het Google Analytics meetscript geregeld worden. Het ligt aan de situatie welke oplossing er het beste toegepast kan worden. Hieronder de diverse situatie met de bijbehorende oplossing:

Pagina met (i)frame op hetzelfde hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • voorbeeld.nl/pagina-in-frame.html

Omdat zowel de hoofdpagina als de pagina die in het frame geladen wordt op hetzelfde domein staan zijn er geen problemen met de meting. Op beide pagina's wordt er gebruik gemaakt van dezelfde cookies en hoeft er dus niets te gebeuren.

Pagina met (i)frame op een subdomein van hetzelfde hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • sub.voorbeeld.nl/pagina-in-frame.html

Omdat technisch gezien de beide pagina's op een ander domein staan maken ze allebei standaard gebruik van hun eigen cookies. Wat er dan gebeurd is dat in het (i)frame de hoofdpagina.html als verwijzende bron in de cookies geplaatst wordt. Dit is niet een gewenste situatie omdat je dan je eigen site als externe verwijzende bron gerapporteerd ziet worden. Er zijn 2 oplossingen. De eerste is door op het subdomein ook gebruik te maken van de cookies op het hoofddomein. Dit kan gedaan worden door de volgende regel in de Google Analytics meetcode op te nemen op beide domeinen:

pageTracker._setDomainName(".voorbeeld.nl");

De cookies worden dan op 1 centrale plaats gebruikt. Helaas werkt dit niet voor 2 letter domeinen, daar moet de cookie op "www.xx.nl" gezet worden.

De tweede oplossing (die je dus ook bij 2 letter domeinen moet gebruiken) is door de cookies van het hoofddomein mee te geven aan het subdomein. Dit kan gedaan worden door het (i)frame met javascript in de pagina te plaatsen:

<script>
document.write('<iframe src="' + pageTracker._getLinkerUrl("http://sub.voorbeeld.nl/pagina-in-frame.html") + '"></iframe>');
</script>
<noscript>
<iframe src="http://sub.voorbeeld.nl/pagina-in-frame.html"></iframe>
</noscript>

Of met de asynchrone Google Analytics code:

<div id="myIframe"></div>
<script>
var iframe_url = 'http://sub.voorbeeld.nl/pagina-in-frame.html';
window.onload = function() {
var divElm = document.getElementById('myIframe');
var iFrame = document.createElement('iframe');
iFrame.src = _gat ? _gat._getTrackerByName()._getLinkerUrl(iframe_url, false) : iframe_url;
divElm.appendChild(iFrame);
};
</script>
<noscript>
<iframe src="http://sub.voorbeeld.nl/pagina-in-frame.html"></iframe>
</noscript>

Let op: de Google Analytics functies (ga.js) moeten wel al ingeladen zijn voor dit script gebruikt word. De _getLinkerUrl functie zorgt er voor dat de Google Analytics cookies meegegeven worden aan de URL van het (i)frame.

Pagina met (i)frame op een ander (sub)domein dan het hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • example.com/pagina-in-frame.html

Deze situatie komt bijvoorbeeld vaak voor bij externe boekingssytemen. Op een of andere manier wil je de Google Analytics cookies toch meesturen om zo de uiteindelijke conversie aan de juiste bezoekersbron toe te kennen.

In principe kan voor deze situatie dezelfde oplossing gebruikt worden als in bovenstaande situatie: schrijf het (i)frame met javascript in de pagina.

Maar dan komt het echte probleem: Internet Explorer ziet pagina's van externe domeinen die geladen worden in een (i)frame als Third Party Content. Oftewel: cookies vanaf deze pagina's worden door de beveiligingsinstellingen geblokkeerd. En omdat de cookies geblokkeerd worden zal er ook geen Google Analytics meting plaatsvinden. Dit kun je dan weer oplossen met P3P.

p3

P3P en Internet Explorer

Wat is P3P dan precies? P3P staat voor "Platform for Privacy Preferences Project". Ik ga niet uitleggen wat het precies is, daar zijn anderen beter in en herhaling is ook zo saai. 😉 Maar de korte samenvatting is: "je koppelt een privacy beleid aan je site met een door computers en mensen te begrijpen inhoud".

Wat is er dan zo mooi aan? Met het juiste P3P privacy beleid zal Internet Explorer de cookies van het externe domein in het (i)frame keurig accepteren en zal er dus een Google Analytics meting plaatsvinden. De voordelen zijn:

  • Wanneer je site ingeframed wordt door een externe site zal dit keurig gemeten worden
  • Dit geldt dus ook voor de Google Image Search die ineens wel meetbaar wordt
  • Je Google Analytics meting is weer een stapje vollediger en betrouwbaarder

Een duidelijke zaak dus dat je dit geïmplementeerd wil hebben. Wat moet er voor gebeuren, hieronder stap voor stap de acties:

Toevoeging in de <head>
In de <head> moet een element opgenomen worden dat verwijst naar de plek waar de P3P instellingen te vinden zijn. Dit ziet er als volgt uit:

<link rel="P3Pv1" href="/w3c/p3p.xml" />

De locatie die ik hanteer is tevens de standaard locatie waar dit bestand zou moeten staan.

Inhoud van het P3P XML bestand

<META xmlns="http://www.w3.org/2002/01/P3Pv1">
<POLICY-REFERENCES>
<POLICY-REF about="http://andrescholten.nl/w3c/privacy.xml#Privacy_Policy">
<INCLUDE>/*</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>

Zoals je ziet staat hier weer een verwijzing in naar de plek waar de voor de computer te begrijpen privacy instellingen te vinden zijn. De inhoud van dat bestand kun je hier bekijken. Daarin staat het privacy beleid wat je voert beschreven, tevens een link naar de voor mensen te begrijpen privacy statement.

Toevoeging in de headers van je site
Bekijk eerst de HTTP headers van mijn site (handige tool om ook redirects te controleren). Zoals je kunt zien staat deze zin er in:

p3p: policyref="http://andrescholten.nl/w3c/p3p.xml", CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

In deze header staat ook een link naar het P3P XML bestand en tevens een verkorte notatie van het privacy beleid. In WordPress kun je in je header.php op regel 1 op deze manier de header toevoegen:

<?php header("p3p: policyref="http://andrescholten.nl/w3c/p3p.xml", CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"");?>

De afronding
Nadat je zelf ook een publieke privacy statement online hebt gezet (wat verplicht is als je Google Analytics gebruikt), kun je je beleid valideren. Als alles goed is gegaan worden nu ook cookies van externe domeinen in een (i)frame geaccepteerd.

Tipje: ik heb deze P3P editor gebruikt. En alsjeblieft: ga me niet naar de verkorte notatie vragen die in de headers gebruikt worden. Zo zwaar heb ik me daar niet in verdiept, ik was alleen op zoek naar een oplossing voor Google Analytics 😉

De resultaten

Wanneer ik nu mijn site in een (i)frame laadt vanaf een andere site worden toch de Google Analytics cookies geplaatst. Dit is bijvoorbeeld de (ingeknipte) inhoud van de utmz cookie wanneer ik een ingeframed bezoek doe vanuit de Google Image search:

__utmz
utmcsr=images.google.nl
utmccn=(referral)
utmcmd=referral
utmcct=/imgres

Lees ook hoe ik dit weer gebruik om de Google Image Search als zoekmachine door te meten inclusief het gebruikte zoekwoord.

Click to activate social bookmarks