Passer au contenu principal

Gestion du consentement

Selon le pays dans lequel vous exploitez votre site web, vous devrez peut-être gérer le consentement avant de collecter des données sur vos visiteurs. Vous pouvez en savoir plus à ce sujet dans la documentation.

Réconciliation cross-device de l’historique

La fonctionnalité de réconciliation cross-device de l’historique de Kameleoon fusionne l’historique et les actions d’un utilisateur sur différents appareils. Lorsqu’un utilisateur visite un site web plusieurs fois via différents appareils, Kameleoon l’identifie comme un visiteur récurrent et signale avec précision le nombre de visites. Cette fonctionnalité est simple à activer tant que vous pouvez identifier les utilisateurs, généralement via une connexion client. En utilisant la réconciliation cross-device de l’historique, vous bénéficiez de trois avantages majeurs :
  • Un système de ciblage cohérent qui prend en compte toutes les visites et actions sur les appareils.
  • Garantir qu’un visiteur voit la même variation pour une expérience A/B donnée, indépendamment de l’appareil qu’il utilise.
  • Un système de reporting précis et fiable qui compte correctement les visiteurs uniques.
Pour en savoir plus sur cette fonctionnalité, vous pouvez consulter cette documentation.

Gestion ITP

Si une part importante du trafic de votre site web provient d’appareils mobiles, mettez en œuvre une méthode de synchronisation des cookies pour éviter les problèmes liés à l’Intelligent Tracking Prevention (ITP) sur Safari. Pour plus de détails techniques sur la gestion ITP, consultez la documentation. Plusieurs options sont disponibles pour synchroniser l’identifiant visitorCode (via le cookie kameleoonVisitorCode) entre le front-end et le back-end afin d’éviter les problèmes ITP sur Safari. Ces options incluent :
  • Modifier la configuration de votre serveur web frontal ou de votre Content Delivery Network (CDN) pour générer et ajouter le cookie kameleoonVisitorCode. Kameleoon peut fournir des instructions pour Akamai.
  • Implémenter un snippet de code spécifique sur votre serveur backend (Java, NodeJS ou un autre langage).

Snippet de code Nginx

Pour l’intégration avec Nginx, utilisez le snippet de code suivant :
server {
    listen 80;
    server_name MY_DOMAIN;

    set $visitorCode "";

        if ($http_cookie ~* "kameleoonVisitorCode=([^;]+)") {
        set $visitorCode $1;
    }

        if ($visitorCode = "") {
        set_by_lua_block $visitorCode '{
            local alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" 
            local code = "" 
            for i = 1, 16 do
                local randomNumber = math.random(1, #alphabet)
                code = code .. alphabet:sub(randomNumber, randomNumber)
            end
            return code
        }';
    }

    location / {
        add_header Set-Cookie "kameleoonVisitorCode=$visitorCode; Expires=$expires; Path=/; Domain=MY_DOMAIN;";
        return 204; 
    }
}

Snippets de code backend

Vous pouvez héberger l’un des snippets de code back-end soit sur une URL unique appartenant à votre domaine principal, soit sur chaque page. Si vous optez pour un endpoint unique, Kameleoon effectue un appel par session vers l’endpoint spécifié pour s’assurer que votre serveur définit le cookie kameleoonVisitorCode. Cet appel est asynchrone et se produit après le chargement complet de la page. Contactez votre Customer Success Manager pour activer cette option. Kameleoon aura besoin de l’URL que vous choisissez.
L’endpoint de synchronisation que vous créez ne doit retourner aucune donnée. Un code de réponse 204 No Content suffit. Cet endpoint est utilisé uniquement pour définir un cookie côté serveur et doit accepter une requête GET envoyée à l’URL de synchronisation que vous définissez, en utilisant le code suivant :
const e = new XMLHttpRequest;
e.open("GET", Kameleoon.Internals.configuration.synchronizationEndpointURL + "?visitorCode=" + this.visitorCode, !0);
Si vous intégrez le snippet de code back-end sur chaque page, aucune action supplémentaire n’est nécessaire. Le cookie sera automatiquement créé lorsque des requêtes de page normales seront effectuées vers vos serveurs.
Vous pouvez fournir votre propre code visiteur, généralement un identifiant unique de votre base de données, au lieu de vous appuyer sur la génération automatique. Assurez-vous que le visitorCode que vous fournissez est unique pour chaque visiteur afin de garantir des données précises pour vos expériences.
Si vous utilisez à la fois Kameleoon Web et Feature Experiments avec l’un des SDKs côté serveur, vous pouvez directement utiliser la méthode getVisitorCode(). Cette méthode utilitaire récupère automatiquement le code visiteur Kameleoon pour le visiteur actuel et crée le cookie côté back-end.

Java

javax.servlet.http.HttpServletRequest request; // Provide a reference to the HttpServletRequest
javax.servlet.http.HttpServletResponse response; // Provide a reference to the HttpServletResponse
String topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
String visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

String cookiesHeader = request.getHeader("Cookie");
if (cookiesHeader != null) {
	String[] cookies = cookiesHeader.split(";");
	for (String cookieNameAndValue : cookies) {
		String[] cookieNameAndValuePair = cookieNameAndValue.split("=");
		if (cookieNameAndValuePair[0].trim().equals("kameleoonVisitorCode")) {
			visitorCode = cookieNameAndValuePair[1];
		}
	}
}
if (visitorCode == null) {
	final String alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	final int alphabetLength = alphabet.length();
	final int visitorCodeLength = 16;
	final StringBuilder visitorCodeBuilder = new StringBuilder(visitorCodeLength);
	for (int i = 0; i < visitorCodeLength; ++i) {
		visitorCodeBuilder.append(
				alphabet.charAt(java.util.concurrent.ThreadLocalRandom.current().nextInt(alphabetLength))
		);
	}
	visitorCode = visitorCodeBuilder.toString();
}

javax.servlet.http.Cookie cookie = new Cookie("kameleoonVisitorCode", visitorCode);
cookie.setMaxAge(32_832_000);
cookie.setHttpOnly(false); // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
cookie.setPath("/");
cookie.setDomain(topLevelDomain);
response.addCookie(cookie);

NodeJS

let topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
let visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

request.headers && request.headers.cookie.split(';').forEach(function (cookie) {
	let cookieNameAndValuePair = cookie.match(/(.*?)=(.*)$/);
	if (cookieNameAndValuePair[1].trim() == "kameleoonVisitorCode") {
		visitorCode = cookieNameAndValuePair[2].trim();
	}
});
if (!visitorCode) {
	let alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	let alphabetLength = alphabet.length;
	visitorCode = "";
	for (let i = 0; i < 16; ++i) {
		let randomNumber = Math.floor(Math.random() * alphabetLength);
		visitorCode += alphabet[randomNumber];
	}
}

let expires = new Date(new Date().getTime() + 32832000000);
response.writeHead(200, {
		'Set-Cookie': [`kameleoonVisitorCode=${visitorCode}; expires=${expires}; path=/; domain=${topLevelDomain};`]
});

PHP

<?php
$topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
$visitorCode = NULL; // Here you can provide your own identifier if needed, else it will be generated randomly

if (isset($_COOKIE["kameleoonVisitorCode"])) {
	$visitorCode = $_COOKIE["kameleoonVisitorCode"];
}
if (is_null($visitorCode)) {
	$alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
	$alphabetLength = strlen($alphabet);
	$visitorCode = "";
	for ($i = 0; $i < 16; $i++) {
		$randomNumber = floor((mt_rand() / mt_getrandmax()) * $alphabetLength);
		$visitorCode .= substr($alphabet, $randomNumber, 1);
	}
}

setcookie("kameleoonVisitorCode", $visitorCode, time() + 32832000, "/", $topLevelDomain);
?>
Copiez-collez ce code et remplacez MY_DOMAIN par votre domaine principal de base (par exemple, mydomain.com).

C#

System.Security.Cryptography.RandomNumberGenerator rng; // A concurrent RNG for generating unique visitor codes
Microsoft.AspNetCore.Http.HttpRequest request; // Provide a reference to the HttpRequest
Microsoft.AspNetCore.Http.HttpResponse response; // Provide a reference to the HttpResponse
string topLevelDomain = "MY_DOMAIN";// Here you must provide your own base domain, eg mydomain.com
string visitorCode = null; // Here you can provide your own identifier if needed, else it will be generated randomly

if (request.Cookies.ContainsKey("kameleoonVisitorCode"))
visitorCode = request.Cookies["kameleoonVisitorCode"];

if (visitorCode == null)
{
const string alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
const int visitorCodeLength = 16;
char[] visitorCodeBuffer = new char[visitorCodeLength];
byte[] randBuffer = new byte[visitorCodeLength];
rng.GetBytes(randBuffer);
for (int i = 0; i < visitorCodeLength; i++)
    visitorCodeBuffer[i] = alphabet[randBuffer[i] % alphabet.Length];
visitorCode = new string(visitorCodeBuffer);
}

var cookieOptions = new Microsoft.AspNetCore.Http.CookieOptions.CookieOptions();
cookieOptions.Expires = DateTime.Now.AddSeconds(32_832_000);
cookieOptions.HttpOnly = false; // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
cookieOptions.Path = "/";
cookieOptions.Domain = topLevelDomain;
response.Cookies.Append("kameleoonVisitorCode", visitorCode, cookieOptions);

Go

var request *fasthttp.Request // Provide a reference to the Request
var response *fasthttp.Response // Provide a reference to the Response
const topLevelDomain = "MY_DOMAIN" // Here you must provide your own base domain, eg mydomain.com
var visitorCode string // Here you can provide your own identifier if needed, else it will be generated randomly

if binaryVisitorCode := request.Header.Cookie("kameleoonVisitorCode"); binaryVisitorCode != nil {
	visitorCode = string(binaryVisitorCode)
}
if visitorCode == "" {
	const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
	const visitorCodeLength = 16
	visitorCodeBuilder := strings.Builder{}
	visitorCodeBuilder.Grow(visitorCodeLength)
	randomBuffer := make([]byte, visitorCodeLength)
	if _, err := rand.Read.Read(randomBuffer); err != nil { // crypto/rand
		// handle error
	}
	for i := 0; i < visitorCodeLength; i++ {
		visitorCodeBuilder.WriteByte(alphabet[randomBuffer[i] % len(alphabet)])
	}
	visitorCode = visitorCodeBuilder.String()
}

ck := fasthttp.AcquireCookie()
ck.SetKey("kameleoonVisitorCode")
ck.SetValue(visitorCode)
ck.SetExpire(time.Now().Add(380 * 24 * time.Hour))
ck.SetHTTPOnly(false) // The cookie must be accessible from the front-end since it stores the visitorCode, which Kameleoon uses to bucket users into experiments and track their activity.
ck.SetPath("/")
ck.SetDomain(topLevelDomain)
response.Header.SetCookie(ck)
fasthttp.ReleaseCookie(ck)

Python

import random

topLevelDomain = "MY_DOMAIN" # Here you must provide your own base domain, eg mydomain.com

# Here you can provide your own identifier via customer_visitor_code if needed, else it will be generated randomly
def fill_visitor_code(request, response, customer_visitor_code):
    visitor_code = request.cookies.get("kameleoonVisitorCode")
    if "kameleoonVisitorCode" in request.cookies:
        visitor_code = request.cookies.get("kameleoonVisitorCode")
    else:
        visitor_code = customer_visitor_code if customer_visitor_code is not None else "".join(
            random.choice(string.ascii_lowercase + string.digits) for _ in range(16)
        )
    response.set_cookie("kameleoonVisitorCode", visitor_code, max_age=32832000, domain=topLevelDomain)

fill_visitor_code(request, response) # The method must be called with correct arguments (depending on your Python web framework)

Ruby

# Define constants
KAMELEOON_COOKIE_VALUE_LENGTH = 16
KAMELEOON_COOKIE_NAME = 'kameleoonVisitorCode'.freeze
EXPIRE_DAYS = 365

# Method to generate a random visitor code
def generate_visitor_code(length)
  alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789'
  alphabet_length = alphabet.length
  visitor_code = ''

  length.times do
    random_number = rand(alphabet_length)
    visitor_code.concat(alphabet[random_number])
  end

  visitor_code
end

# Main code
top_level_domain = 'MY_DOMAIN' # Replace with your actual domain
visitor_code = cookies[KAMELEOON_COOKIE_NAME]

visitor_code = generate_visitor_code(KAMELEOON_COOKIE_VALUE_LENGTH) if visitor_code.nil? || visitor_code.empty?

kameleoon_cookie = {
  value: visitor_code,
  expires: Time.now + 60 * 60 * 24 * EXPIRE_DAYS,
  path: '/',
  domain: top_level_domain
}

cookies[KAMELEOON_COOKIE_NAME] = kameleoon_cookie

Utiliser un domaine personnalisé

Si vous voulez utiliser votre propre domaine au lieu du domaine par défaut de Kameleoon, ou si des bloqueurs de publicités empêchent certains utilisateurs d’être inclus dans les expériences, Kameleoon offre une option premium pour configurer un domaine personnalisé et contourner la détection. En savoir plus sur l’activation d’un domaine personnalisé.

Utiliser votre propre CDN ou serveur d’hébergement (auto-hébergement)

Le fichier d’application Kameleoon engine.js (précédemment nommé kameleoon.js) peut être hébergé soit sur le CDN Kameleoon, soit sur votre propre CDN ou vos propres serveurs. L’héberger sur vos propres serveurs peut offrir une légère amélioration de performance en évitant une requête DNS et une poignée de main SSL supplémentaires que le CDN Kameleoon nécessite. De plus, l’auto-hébergement peut être préféré pour des raisons de sécurité, car vous pouvez garantir la conformité avec vos politiques de sécurité internes et assumer la responsabilité de la sécurité de vos serveurs d’hébergement. Si vous voulez auto-héberger le fichier d’application Kameleoon, consultez la documentation auto-hébergement.