Google Analytics, P3P, iframes, Internet Explorer en cookies
Categorie: Webanalytics
Wat 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 type="text/javascript">
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>
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.
![]()
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.
Gerelateerde posts
Zoekt men in Google op “Het Internet” of in “het Nederlands”?...
Yahoo Site Explorer update...
Google Image Search doormeten met Google Analytics...
Google Analytics en 2 letter domeinen in IE...
Google Analytics zonder javascript...
99% van de Google Analytics implementaties is illegaal...


20 April 2009 22:08
Op deze pagina is informatie te vinden over hoe Internet Explorer precies met P3P omgaat.
Hier staat dus welke policies voor cookie acceptatie zorgen en welke niet.
Daarnaast staat er dat je alleen een verkorte policy nodig hebt voor cookie acceptatie. Het XML bestand is hiervoor dus niet noodzakelijk.
20 April 2009 22:19
@Jorrit: dank voor de link. Ik weet dat het met de korte policy al werkt, maar een volledige implementatie kan geen kwaad
29 April 2009 10:53
Andre,
Natuurlijk was ik van plan om je aanpassing direct door te laten voeren bij een klant van mij, maar ook (bijna) natuurlijk ondersteund het CMS deze methode niet standaard. En blijkt het een kostbare aangelegenheid om deze aanpassing aan het cms door te voeren. Nu werd aan mij gevraagd of het zich inderdaad terug vertaald in betere cijfers. Naar aanleiding daarvan ben ik eens gaan kijken wat er nu daadwerkelijk gebeurt met het cookie als de iframe pagina wordt aangesproken. Eerlijk gezegd zie ik niks veranderen aan het cookie en blijft de originele bron van afkomst bestaan in het cookie van de geladen iframe pagina. Kortom ik begrijp je oplossing, maar blijkbaar zijn er uitzonderingen wanneer je je oplossing toepast.
ik heb het alsvolgt gestest. Al mijn cookie's die betrekking hebben op het betreffende domein verwijderd.
Vervolgens via een google adwords advertentie naar de site gegaan.
Cookie is geplaatst met de juiste bron informatie
vervolgens ben ik naar een pagina gegaan met daarin het iframe en heb gecontroleerd of de bron informatie van Google adwords naar direct werd overschreven... En dat was niet het geval.
voorbeeld.nl/bestel met iframe bestel.voorbeeld.nl/helelangenaampagina beide GA tags maken gebruik van pageTracker._setDomainName("voorbeeld.nl");
pageTracker._setAllowLinker(true);
Ik heb het een ander gecontroleerd met firefox en firebug
Test ik het nou verkeerd of is jou oplossing op en of andere manier hierop niet van toepassing?
29 April 2009 11:09
Jouw voorbeeld gaat over een subdomein en een hoofddomein van hetzelfde domein, daar treedt het probleem niet op aangezien sub domeinen cookies kunnen delen met hun hoofddomein. Dat wordt ook genoemd in het 2de stuk hierboven "Pagina met (i)frame op een subdomein van hetzelfde hoofddomein".
29 April 2009 11:16
Om te beginnen bedankt voor je snelle respons. Je hebt gelijk, ik heb te snel een conclusie getrokken.. Dan toch nog een klein vraagje. Hoe belangrijk is de . voor het domein? want deze staat er bij mijn klant niet voor..
29 April 2009 12:54
Volgens mij is die redelijk belangrijk omdat je dan aangeeft dat alles wat eindigt op .domein.nl bij de cookie mag. Maar wellicht dat het zonder die punt ook werkt, nog nooit getest eigenlijk.
29 April 2009 13:05
Ik zal het eens laten wijzigen en kijken of het enig verschil uit maakt. Ik laat je weten wat het resultaat is. Alvast bedankt.
18 May 2009 14:14
He André
bedankt voor de uitleg waar ik al een tijdje naar op zoek was!
Ik heb een iframe.php bij een andere site hangen en zou inderdaad graag ook de bezoeken aan die site kunnen zien/meetellen in mijn analytics.
Ik heb je stappen gedaan alleen was mijn vraag nog even: de toevoeging in de headers .. moet dit in de header van mijn iframe.php of in de headers van de desbetreffende website waar mijn iframe in getoond wordt ?
Alvast bedankt!
18 May 2009 15:55
In de headers van je iframe
11 June 2009 20:35
Had er zelf nog geen last gehad, maar het is altijd interessant om te weten dat er oplossingen bestaan voor dergelijke problemen...
8 July 2009 10:57
Hoi Andre,
Handig artikel!
Alleen zit ik toch nog even met je punt "Pagina met (i)frame op hetzelfde hoofddomein" hier kan je uiteindelijk niet meten als de iframe pagina veranderd binnen de gestelde pagina.
Stel je hebt "example.com/iframe"
Ik bezoek de site en druk binnen het iframe op een blok. Vervolgens herlaat de iframe maar de url verandert niet omdat de hoofdpagina ook niet veranderd want je clickt immers binnen het iframe. Dus dan valt het toch niet te meten?
Groeten en bedankt,
Benjamin
8 July 2009 18:28
Jawel, wanneer de iframe herlaad krijgt die een andere URL, en dus kun je die meten. De oplossing is door in je iframe code ook een Google Analytics meetcode te plaatsen.
20 July 2009 19:58
Thanx André! Heb er veel aangehad en het is me gelukt...
18 November 2009 13:10
Hoi Andre,
Ik heb tutorial gelezen en ik weet niet of mij dit lukt?
Hier is de verhaal:
ik heb website: http://www.iets.nl die houd in de iframe van affiliate partner affiliatepartner.nl
Ik heb P3P geinstaleerd zoals jij dat deed.
Volgende code heb ik van partner erin geplaatst:
dan heb ik analytics zoals volgende geplaatst:
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
try {var pageTracker = _gat._getTracker("UA-xxxxxxxx-xx");
pageTracker._setDomainName("none");
pageTracker._setAllowLinker(true);
pageTracker._trackPageview();
} catch(err) {}
var iframe = document.getElementById("myIFrame");
iframe.src = pageTracker._getLinkerUrl("http://mini.beslist.nl/minisite/?request=list&query=acer&maincatID=6");
Met die p3p heb ik geen privacy raport, wat denk ik betekent dat ik p3p goed geinstaleerd had!
En nu nog doel opzetten:
bij de doelen in analytics heb ik volgende gezet:
http://mini.beslist.nl/php/ (hier komt nog veel meer erachter, maar dat zijn wel rare codes)
omdat hiernaa komt een blank link die leidt naar een doel
Dus als ik klik op de link in analytics bij de doelen zie ik niks
en hoe kan ik uberhoupt zien of het werkt???
Ik ben al week me bezig en niks....
gr. daka
23 November 2009 21:35
He Daka, kun je dit misschien even naar me mailen? Dan zitten ook alle codes er bij
10 March 2010 21:31
Hallo Andre, mooie info!
Ik heb een externe booking engine in een (i)frame. Moet ik de P3P header nu aanpassen op mijn eigen site of op het domein van de (i)frames?
Groet,
Rien
11 March 2010 9:07
Op het domein van het iframe
11 March 2010 9:23
Dank.
Je zit me toch niet uit te lachen he