Wer Webtracking Datenschuz - resp. DSGVO-konform betreiben will, kommt an Matomo kaum vorbei. Als Open-Source-Alternative zu Google Analytics bietet Matomo die volle Kontrolle über Nutzerdaten – insbesondere bei Selbsthosting. Doch gerade beim Einsatz in datenschutzsensiblen Umgebungen empfiehlt sich ein zusätzlicher Trick: der Einsatz eines Matomo Proxys.
Was ist ein Matomo Proxy?
Ein Matomo Proxy ist eine Art „Vermittler“ zwischen dem Browser des Website-Besuchers und dem eigentlichen Matomo-Server. Statt dass das Tracking-Skript (meist matomo.js
) und der Tracking-Endpunkt (matomo.php
) direkt vom Matomo-Server geladen werden, werden sie über den eigenen Webserver ausgeliefert. Technisch handelt es sich dabei um eine einfache Weiterleitung oder Spiegelung.
Warum sollte man einen Matomo Proxy verwenden?
1. Datenschutz verbessern:
Durch den Proxy erscheint der gesamte Tracking-Traffic so, als käme er vom eigenen Webserver. Das verhindert Verbindungen zu Drittdomains und reduziert das Risiko, dass z. B. Adblocker oder Browser-Einstellungen das Tracking blockieren. Das ist insbesondere relevant für die Cookie-freie Konfiguration, die Matomo DSGVO-konform ohne Zustimmung ermöglicht.
2. Adblocker umgehen:
Viele Werbeblocker erkennen die Domain des Matomo-Servers und blockieren Tracking-Anfragen automatisch. Wenn das Skript und die Anfragen jedoch über die Hauptdomain laufen (z. B. example.com/matomo-proxy/matomo.js
), ist die Erkennung deutlich schwieriger.
3. Performance optimieren:
Statische Dateien wie matomo.js
lassen sich über den Proxy mit geeigneten Cache-Headern ausliefern. Das kann die Ladezeit der Seite verbessern – gerade bei vielen Besuchern ein Vorteil.
4. Fallback / Zwischenspeichern (Optional)
Bei einem Ausfall, Störung oder Wartung des effektiven Matomo Server können die Daten auf dem Web Server zwischengespeichert und später wieder eingespielt werden.
So richtest du einen Matomo Proxy ein:
Matomo selbst bietet ein offizielles Proxy Script auf GitHub an.
Die Einrichtung ist simpel:
- Lade das Repository herunter und kopiere die Dateien (z. B.
piwik.php
,matomo.js
, .htaccess
) in ein Unterverzeichnis deiner Website, z. B.example.com/matomo-proxy/
.
2 . Passe ggf. die proxy.config.php
an und gib die URL deines Matomo-Servers an.
3 .Ändere den Tracking-Code auf deiner Website so, dass er das Skript über den Proxy lädt:
var _paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//trackedsite.com/";
_paq.push(["setTrackerUrl", u+"matomo.php"]);
_paq.push(["setSiteId", "tracked-site-id-here"]);
var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0];
g.type="text/javascript"; g.async=true; g.defer=true; g.src=u+"matomo.php"; s.parentNode.insertBefore(g,s);
})();
Optional: Fallback
Dieser Teil muss Manuell ins Script proxy.php
eingefügt werden, bei ca. Zeile 148:
// Tracking Fallback to SQLite
forwardToMatomoWithFallback($httpStatus, $_GET, $extraQueryParams, $user_agent);
Am Ende des Scripts proxy.php
dann folge Teil hinzufügen:
function forwardToMatomoWithFallback($httpCode, $httpGet, $extraQueryParams, $userAgent ) {
if (str_contains($httpCode, 204) || str_contains($httpCode, 200)) {
echo "Status code 200 or 204 found, skip processing.";
} else {
$db = new SQLite3(__DIR__ . '/matomo-failed.db');
$db->exec("CREATE TABLE IF NOT EXISTS failed_requests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp INTEGER,
query TEXT,
user_agent TEXT,
accept_language TEXT
)");
$query = http_build_query(array_merge($extraQueryParams, $httpGet));
$db->busyTimeout(5000);
$acceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'unknown';
// Exclude requests to CoreAdminHome matomo-opt-out
if (!str_contains($query, 'module=CoreAdminHome')) {
// Save SQLite-Fallback
$stmt = $db->prepare("INSERT INTO failed_requests (timestamp, query, user_agent, accept_language)
VALUES (:ts, :query, :ua, :lang)");
$stmt->bindValue(':ts', time(), SQLITE3_INTEGER);
$stmt->bindValue(':query', $query, SQLITE3_TEXT);
$stmt->bindValue(':ua', $userAgent, SQLITE3_TEXT);
$stmt->bindValue(':lang', $acceptLang, SQLITE3_TEXT);
$stmt->execute();
$stmt->close();
}
}
}
Somit werden die Verbindungsdaten in ein Sqlite geschrieben.
Mit diesem Script replay.php
können werden die Daten im gesammelten Sqlite wieder über die Schnittstelle an den Matomo Server gesendet und eingespielt.
<?php
if (file_exists(__DIR__.'/config.php')) {
include __DIR__.'/config.php';
}
date_default_timezone_set('UTC');
$db = new SQLite3(__DIR__.'/matomo-fallback.db');
$rows = $db->query("SELECT * FROM failed_requests ORDER BY timestamp ASC");
while ($row = $rows->fetchArray(SQLITE3_ASSOC)) {
$url = $MATOMO_URL . 'matomo.php?' . $row['query'];
$cdt = date('Y-m-d H:i:s', $row['timestamp']); // Convert timestamp to human-readable format for cdt
$url .= '&cdt=' . urlencode($cdt);
$opts = [
'http' => [
'header' =>
"User-Agent: {$row['user_agent']}\r\n" .
"Accept-Language: {$row['accept_language']}\r\n"
]
];
$context = stream_context_create($opts);
$res = @file_get_contents($url, false, $context);
if ($res !== false) {
$db->exec("DELETE FROM failed_requests WHERE id = " . (int)$row['id']);
}
}
Mit dem
cdt
wird der Zeitstempel in Matomo übertragen. AuchUser-Agent
undAccept-Language
sind wichtig damit ein Bestehender User diese als Update hinzugefügt werden.
Fazit
Ein Matomo Proxy ist schnell eingerichtet und bietet gleich mehrere Vorteile: besserer Datenschutz, Umgehung von Adblockern und höhere Performance, wie auch die Möglichkeit eines Fallback einzurickten. Für jeden, der Matomo ernsthaft nutzt – ob für kleine Blogs oder grosse Portale – ist der Proxy-Einsatz eine sinnvolle Ergänzung.