Zum Hauptinhalt springen

Einwilligungsverwaltung

Abhaengig vom Land, in dem Sie Ihre Website betreiben, muessen Sie moeglicherweise die Einwilligung verwalten, bevor Sie Daten ueber Ihre Besucher erheben. Mehr dazu lesen Sie in der Dokumentation.

Geraeteuebergreifende Verlaufsabstimmung

Die Funktion zur geraeteuebergreifenden Verlaufsabstimmung von Kameleoon fuehrt den Verlauf und die Aktionen eines Nutzers ueber verschiedene Geraete hinweg zusammen. Wenn ein Nutzer eine Website mehrmals ueber unterschiedliche Geraete besucht, identifiziert Kameleoon ihn als wiederkehrenden Besucher und meldet die Anzahl der Besuche genau. Diese Funktion ist einfach zu aktivieren, solange Sie Nutzer identifizieren koennen, in der Regel ueber eine Kundenanmeldung. Durch die Verwendung der geraeteuebergreifenden Verlaufsabstimmung gewinnen Sie drei wesentliche Vorteile:
  • Ein kohaerentes Targeting-System, das alle Besuche und Aktionen ueber Geraete hinweg beruecksichtigt.
  • Sicherstellen, dass ein Besucher fuer ein bestimmtes A/B-Experiment dieselbe Variation sieht, unabhaengig vom verwendeten Geraet.
  • Ein praezises und genaues Reporting-System, das eindeutige Besucher korrekt zaehlt.
Weitere Informationen zu dieser Funktion finden Sie in dieser Dokumentation.

ITP-Verwaltung

Wenn ein erheblicher Teil des Traffics Ihrer Website von Mobilgeraeten stammt, implementieren Sie eine Cookie-Synchronisationsmethode, um Probleme mit Intelligent Tracking Prevention (ITP) auf Safari zu vermeiden. Weitere technische Details zur ITP-Verwaltung finden Sie in der Dokumentation. Es gibt mehrere Optionen zur Synchronisierung des visitorCode-Identifiers (ueber das Cookie kameleoonVisitorCode) zwischen Front-End und Back-End, um ITP-Probleme auf Safari zu vermeiden. Zu diesen Optionen gehoeren:
  • Aenderung Ihrer vorgeschalteten Webserver- oder Content-Delivery-Network-(CDN)-Konfiguration zur Erzeugung und Hinzufuegung des Cookies kameleoonVisitorCode. Kameleoon kann Anweisungen fuer Akamai bereitstellen.
  • Implementierung eines bestimmten Code-Snippets auf Ihrem Backend-Server (Java, NodeJS oder einer anderen Sprache).

Nginx-Code-Snippet

Verwenden Sie fuer die Integration mit Nginx das folgende Code-Snippet:
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; 
    }
}

Backend-Code-Snippets

Sie koennen eines der Back-End-Code-Snippets entweder auf einer einzelnen URL Ihrer Haupt-Top-Level-Domain oder auf jeder Seite hosten. Wenn Sie sich fuer einen einzelnen Endpoint entscheiden, ruft Kameleoon den angegebenen Endpoint einmal pro Sitzung auf, um sicherzustellen, dass Ihr Server das Cookie kameleoonVisitorCode setzt. Dieser Aufruf erfolgt asynchron, nachdem die Seite vollstaendig geladen wurde. Wenden Sie sich an Ihren Customer Success Manager, um diese Option zu aktivieren. Kameleoon benoetigt die von Ihnen gewaehlte URL.
Der von Ihnen erstellte Synchronisations-Endpoint sollte keine Daten zurueckgeben. Ein Antwortcode 204 No Content ist ausreichend. Dieser Endpoint wird ausschliesslich zum Setzen eines serverseitigen Cookies verwendet und sollte eine GET-Anfrage akzeptieren, die mit dem folgenden Code an die von Ihnen definierte Sync-URL gesendet wird:
const e = new XMLHttpRequest;
e.open("GET", Kameleoon.Internals.configuration.synchronizationEndpointURL + "?visitorCode=" + this.visitorCode, !0);
Wenn Sie das Back-End-Code-Snippet auf jeder Seite einbetten, sind keine zusaetzlichen Aktionen erforderlich. Das Cookie wird automatisch erstellt, wenn normale Seitenanfragen an Ihre Server gestellt werden.
Sie koennen Ihren eigenen Visitor Code angeben, in der Regel einen eindeutigen Bezeichner aus Ihrer Datenbank, anstatt sich auf die automatische Generierung zu verlassen. Stellen Sie sicher, dass der von Ihnen angegebene visitorCode fuer jeden Besucher eindeutig ist, um genaue Daten fuer Ihre Experimente zu gewaehrleisten.
Wenn Sie sowohl Kameleoon Web als auch Feature Experiments mit einem der serverseitigen SDKs verwenden, koennen Sie direkt die Methode getVisitorCode() nutzen. Diese Hilfsmethode ruft automatisch den Kameleoon-Visitor Code fuer den aktuellen Besucher ab und erstellt das Cookie im 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);
?>
Kopieren Sie diesen Code, fuegen Sie ihn ein und ersetzen Sie MY_DOMAIN durch Ihre Top-Level-Basisdomain (d. h. 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

Eine benutzerdefinierte Domain verwenden

Wenn Sie Ihre eigene Domain anstelle der Standarddomain von Kameleoon verwenden moechten oder wenn Werbeblocker einige Nutzer daran hindern, in Experimente einbezogen zu werden, bietet Kameleoon eine Premium-Option zur Einrichtung einer benutzerdefinierten Domain und zur Umgehung der Erkennung. Erfahren Sie mehr darueber, wie Sie eine benutzerdefinierte Domain aktivieren.

Ihren eigenen CDN- oder Hosting-Server verwenden (Self-Hosting)

Die Kameleoon-Anwendungsdatei engine.js (frueher kameleoon.js genannt) kann entweder auf dem Kameleoon-CDN oder auf Ihren eigenen CDN- oder Servern gehostet werden. Sie auf Ihren eigenen Servern zu hosten, kann eine geringfuegige Leistungsverbesserung bieten, indem eine zusaetzliche DNS-Abfrage und ein SSL-Handshake vermieden werden, die das Kameleoon-CDN erfordert. Zudem kann Self-Hosting aus Sicherheitsgruenden bevorzugt werden, da Sie die Einhaltung Ihrer internen Sicherheitsrichtlinien sicherstellen und die Verantwortung fuer die Sicherheit Ihrer Hosting-Server uebernehmen koennen. Wenn Sie die Kameleoon-Anwendungsdatei selbst hosten moechten, lesen Sie die Self-Hosting-Dokumentation.