FOL9000

Google Analytics für interne Zugriffe flexibel blockieren

von

Lässt man eine Web-Site über Google-Analytics tracken, können die eigenen Zugriffe das Ergebnis erheblich verfälschen. Dies gilt für Zugriffe durch Entwickler oder Admins, ganz besonders aber dann, wenn die Web-Site nicht nur von Usern außerhalb des Unternehmens genutzt wird, sondern auch intern im eigenen Unternehmen. Spätestens dann wird es nötig, die eigenen Zugriffe vom Tracking durch Analytics auszuschließen. Analytics selbst bietet dazu eine Lösung an, die darauf basiert, bestimmte IP-Adressen auszuschließen. Diese Lösung ist jedoch nicht immer praktikabel. Mit einigen Zeilen PHP hab ich mir deshalb eine Lösung geschrieben, die in ganz unterschiedlichen Umgebungen unabhängig von Netzen oder IP-Adressen oder Host-Namen von unterschiedlichen Projekt-Teilnehmern und Nutzern in unterschiedlichen Projekten und Umgebungen eingesetzt werden kann.

Die Analytics-eigene Lösung über einen Ausschluss von IP-Adressen oder Host-Namen ist für Teams, die von unterschiedlichen Orten mit unterschiedlichen Rechnern ggf. sogar von unterwegs auf die Seiten zugreifen nicht praktikabel. Andererseits gibt es für die verschiedenen Browser Plugins und Extensions, um Analytics (und anderen Trackern) zu signalisieren, dass man nicht getrackt werden möchte (z.B. per Do Not Track). Diese Lösungen sind jedoch alle Browser- und oder Betriebssystem-abhängig. Ich wollte eine Lösung, die ich auf dem Server installieren kann und die immer, mit allen Clients, funktioniert und die von mir selbst weitgehend gesteuert und ggf. erweitert werden werden kann.

Man könnte die paar Zeilen PHP sicher auch noch vereinfachen. Aber ich habe für die Zukunft noch ein paar Ideen, um dieses Script zu erweitern, deshalb sieht das ganze vielleicht etwas umständlicher als nötig aus.

Die Idee, auf der die hier vorgestellte Lösung basiert, ist ganz einfach:

Der Google Analytics-Code soll in die Web-Seiten nur dann eingefügt werden, wenn ein bestimmter Cookie nicht gesetzt ist. Interne User — die nicht getrackt werden sollen — können dazu eine Seite aufrufen, die den Cookie setzt. Externe User — also User, deren Verhalten getrackt werden soll — haben keinen Zugriff auf diese Seite, können den Cookie also auch nicht setzen, der Analytics-Code wird eingefügt und sie werden wie gewünscht getrackt.

Noch einmal, falls es jemand überlesen hat: Der Cookie verhindert das Einfügen des Analytics-Codes, nicht etwa seine Ausführung o.ä. — es soll für interne User gar nichts zum Ausführen eingefügt werden.

Das klingt komplizierter als es ist und es ist ganz einfach in ein paar Zeilen PHP zu realisieren.

Noch eins vorweg: Ein Cookie hat einen Namen und einen Wert. Der Wert ist hier (erst einmal) völlig unwichtig, auch wenn ich im Script on/off-Werte vorgesehen sind. Der Name ist ebenfalls beliebig, ich habe den Cookie hier ‚internal-user-cookie‘ genannt.

Am einfachsten ist der Code in der Anwendung selbst. Es reichen ein paar Zeilen um den Analytics-Code:

<?php
if (!isset($_COOKIE['internal-user-cookie'])) {
  $ga_code = <<< EOGA
<script>

  // Hierhin kommt der Analytics-Code

</script>
EOGA;
  echo $ga_code;
}
?>

Wer schon Analytics einsetzt, muss nur die Zeilen um den JavaScript-Code von Google hinzufügen. Wer hingegen Analytics noch nicht einsetzt: Das ganze kommt in den head-Bereich der Seiten. In WordPress z.B. findet sich der in der Datei header.php.

Damit ist eigentlich schon das wichtigste gemacht. Fehlt nur noch die Datei, mit der der Cookie gesetzt und auch wieder gelöscht werden kann. Damit’s etwas komfortabler ist, ist sie ein wenig umfangreicher.

<?php

$cookie_name  = 'internal-user-cookie';
$cookie_on  = '1';
$cookie_off = '0';

function cookieActive() {
  global $cookie_name, $cookie_on, $cookie_off;
  return (isset($_COOKIE[$cookie_name]) && ($_COOKIE[$cookie_name]===$cookie_on));
}

if (isset($_POST['cookie_action'])) {
  if ($_POST['cookie_action'] === 'set') {
    setcookie($cookie_name, $cookie_on, strtotime('+2000 years'));
    $_COOKIE[$cookie_name] = $cookie_on;
  } else if ($_POST['cookie_action'] === 'del') {
    setcookie($cookie_name, '0', 1);
    $_COOKIE[$cookie_name] = $cookie_off;
  }
}
?>

<!doctype html>
<html lang="de">

<head>
  <meta charset="utf-8"> 
</head>

<body>  
<h1>Internal-User-Cookie</h1>

<?php

if (cookieActive()) {
  echo '<br>Developer-Cookie gesetzt.';
} else {
  echo '<br>Developer-Cookie nicht gesetzt.';
}

?>

<div>
<?php
if (cookieActive()) { 
  echo '<p>Developer-Cookie jetzt löschen?</p>';
} else {
  echo '<p>Developer-Cookie jetzt setzen?</p>';
}
?>

<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  <?php
    if (cookieActive()) {
      $action = 'del';
      $text = 'Ja, jetzt löschen';
    } else {
      $action = 'set';
      $text = 'Ja, jetzt setzen';
    }
  ?>
  <input type="hidden" name="cookie_action" value="<?php echo $action ?>"> 
  <input type="submit" name="submit" value="<?php echo $text ?>">
  
</form>
</div>

</body>
</html>

Ich weiß, die Unterscheidung der Cookie-Werte ist hier so nicht nötig, weil nicht danach unterschieden wird. Um spätere Erweiterungen möglich zu machen, hab ich eine solche Unterscheidung aber schon mal vorgesehen. Das Script ist also auch work-in-progress.

Diese Datei legt man einfach auf den Server (und stellt sicher, dass sie sich aufrufen lässt). Sinnvollerweise sollte die Datei zudem Passwort-geschützt sein, z.B. über die .htaccess– und .htpasswd-Datei. Das Form auf der Seite selbst bietet dann an, den Cookie zu setzen oder zu löschen.

Ob’s funktioniert kann man in den Entwicklertools der Browser sehen, wenn man sich die Cookies anzeigen lässt.

Etwas ganz wichtiges muss man jedoch berücksichtigen: Cookie sind Browser-spezifisch gesetzt. Der Cookie muss deshalb für jede Anwendung, jeden Rechner und jeden Browser eigens gesetzt werden. Das klingt umständlicher als es ist, weil die Zahl der von einem User eingesetzten Rechner-/Browser-Kombinationen i.d.R ja überschaubar ist. Ein Entwickler aber, der verschiedene Browser auf mehreren Rechnern etwa zu Testzwecken einsetzt, muss überall den Cookie setzen. (Das dies so nötig ist kann man auch sehen, wenn man zunächst den Cookie mit einem Browser setzt und dann die Seite mit einem anderen Browser aufruft. Bei ersterem darf der Analytics-Code nicht mit drin sein, bei letzterem muss er drin sein.)

Kommentare sind geschlossen.