Tracker selbst hosten (Anti-Blocking)
Chrome 121+, uBlock Origin, Brave Shields, AdGuard und die meisten Werbeblocker blockieren standardmäßig alle Anfragen an Drittanbieter-Domains, die als „analytics" eingestuft sind — auch wenn der Dienst keinerlei Werbe-Tracking betreibt (was bei uns der Fall ist).
Ohne Maßnahmen verlieren Sie heute bereits 5 bis 20 % der Sessions; dieser Anteil wird in 12 bis 24 Monaten auf 30 bis 50 % steigen, wenn Chrome den _Tracking Protection_-Modus auf alle normalen Sessions ausweitet (nicht nur den privaten Modus).
Die Lösung: Tracker und API über Ihre eigene Domain ausliefern. Der Browser sieht dann eine „1st-party"-Anfrage, die von einem Bild- oder Stylesheet-Aufruf nicht zu unterscheiden ist. Kein Blocker blockiert das.
Diese Seite dokumentiert, wie Sie dies mit First-Party-Konfigurationen umsetzen, die zu einem europäischen Infrastrukturansatz passen. Wählen Sie Hoster und Ausführungsregion nach Ihren Anforderungen an Compliance, Performance und Support.
Funktionsweise — Schematische Übersicht
┌──────────────────────────────────────────────────────────────────────────┐
│ │
│ VORHER (3rd-party, blockiert) │
│ ────────────────────────── │
│ │
│ Browser ──► <script src="https://snorklee.com/w.js"> │
│ ❌ ERR_BLOCKED_BY_CLIENT │
│ │
│ Browser ──► POST https://snorklee.com/api/event │
│ ❌ ERR_BLOCKED_BY_CLIENT │
│ │
└──────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────┐
│ │
│ NACHHER (1st-party via Ihrem Proxy, nie blockiert) │
│ ─────────────────────────────────────────────── │
│ │
│ Browser ──► <script src="/js/flow.js"> auf ihrsite.com │
│ ✅ von Ihrem Proxy aus snorklee.com ausgeliefert │
│ │
│ Browser ──► POST ihrsite.com/api/event │
│ ✅ von Ihrem Proxy an snorklee.com weitergeleitet │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Sie proxieren 3 Endpunkte von Ihrer Domain zu snorklee.com:
| Pfad auf Ihrer Domain | Ziel bei snorklee | Funktion |
|---|---|---|
/js/flow.js | snorklee.com/w.js | Tracker-Skript |
/api/event | snorklee.com/api/event | Pageviews + benutzerdefinierte Events |
/api/ping | snorklee.com/api/ping | „Live"-Heartbeat alle 30 s |
/api/zone | snorklee.com/api/zone | Scroll-Zonen (Leseverhalten) |
Das in Ihren <head> einzufügende Snippet lautet dann:
<script defer src="/js/flow.js" data-site="ihrsite.com"></script>
Alle Pfade sind 1st-party — aus Sicht des Browsers verlässt keine Anfrage die eigene Domain. Serverseitig verbindet Ihr Proxy transparent mit snorklee.com.
Wichtig — Besucher-IP weiterleiten: Ihr Proxy muss den Header X-Forwarded-For korrekt übermitteln, andernfalls verwendet snorklee für die Geolokalisierung die IP Ihres Proxys statt die des Besuchers. Jedes der folgenden Rezepte enthält diesen Schritt explizit.
Rezept 1 — Nginx (das universellste)
Funktioniert auf: jedem Linux-VPS (OVH, Scaleway, Hetzner, Clever Cloud mit Nginx-Runtime, IONOS, Infomaniak usw.).
Souveränität: neutral (hängt von Ihrem Hoster ab; wählen Sie einen EU-Anbieter).
Fügen Sie diesen Block in Ihre Nginx-Konfigurationsdatei ein, innerhalb des server { ... }-Blocks Ihrer Website (typischerweise /etc/nginx/sites-available/ihrsite.conf):
# snorklee — 1st-party Proxy (Anti-Blocking)
location = /js/flow.js {
proxy_pass https://snorklee.com/w.js;
proxy_set_header Host snorklee.com;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Accept-Language $http_accept_language;
proxy_hide_header Set-Cookie;
proxy_read_timeout 10s;
}
location ~ ^/api/(event|ping|zone)$ {
proxy_pass https://snorklee.com$request_uri;
proxy_set_header Host snorklee.com;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header Accept-Language $http_accept_language;
proxy_set_header Origin $http_origin;
proxy_hide_header Set-Cookie;
proxy_read_timeout 10s;
}
Dann testen und neu laden:
sudo nginx -t && sudo systemctl reload nginx
Überprüfung: Öffnen Sie https://ihrsite.com/js/flow.js in Ihrem Browser — Sie sollten den minimierten Tracker-Code sehen. Bei Fehler 502 prüfen Sie, ob proxy_ssl_server_name on; vorhanden ist (für SNI zu snorklee.com zwingend erforderlich).
Rezept 2 — Caddy (das einfachste)
Funktioniert auf: jedem Server, auf dem Caddy läuft (Auto-TLS inklusive).
Souveränität: neutral (hängt von Ihrem Hoster ab).
In Ihrem Caddyfile, innerhalb des Blocks Ihrer Website:
ihrsite.com {
# ... Ihre bestehende Konfiguration ...
# snorklee — 1st-party Proxy (Anti-Blocking)
@snorkleeApi path /api/event /api/ping /api/zone
handle_path /js/flow.js {
rewrite * /w.js
reverse_proxy https://snorklee.com {
header_up Host snorklee.com
header_down -Set-Cookie
}
}
handle @snorkleeApi {
reverse_proxy https://snorklee.com {
header_up Host snorklee.com
header_down -Set-Cookie
}
}
}
Dann:
caddy reload --config /etc/caddy/Caddyfile
Caddy 2.6+-Syntax: Verwenden Sie einen benannten Matcher (@snorkleeApi path …), umhandleauf mehrere Pfade anzuwenden. Die Formhandle /a /b /c { … }wird vom Parser nicht akzeptiert und lässtcaddy validatefehlschlagen.
Caddy fügtX-Forwarded-ForundX-Real-IPautomatisch ein — diese müssen nicht explizit wie bei Nginx deklariert werden.
Rezept 3 — Apache (mod_proxy)
Funktioniert auf: Shared Hosting (OVH, Infomaniak, IONOS) und jedem Apache-Server mit aktiviertem mod_proxy. Nützlich für WordPress-Sites auf cPanel ohne Root-Zugriff.
Souveränität: neutral.
In Ihrer .htaccess-Datei (im Site-Stammverzeichnis) oder in <VirtualHost>:
# snorklee — 1st-party Proxy (Anti-Blocking)
SSLProxyEngine On
# Das Skript
RewriteEngine On
RewriteRule ^js/flow\.js$ https://snorklee.com/w.js [P,L]
# Die API
RewriteRule ^api/(event|ping|zone)$ https://snorklee.com/api/$1 [P,L]
# Besucher-IP erhalten (setifempty, um einen vorhandenen XFF eines vorgelagerten
# LB/Reverse-Proxy nicht zu überschreiben)
ProxyPreserveHost Off
RequestHeader setifempty X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader setifempty X-Real-IP "%{REMOTE_ADDR}s"
# Keine Session-Cookies an den Besucher weiterleiten
Header always unset Set-Cookie
Zu aktivierende Module auf dem Server (bei seriösen EU-Hostern typischerweise bereits aktiv): mod_proxy, mod_proxy_http, mod_ssl, mod_rewrite, mod_headers.
Bei OVH Shared Hosting können Sie die Aktivierung beim Support anfragen — kostenlos und Standard.
Rezept 4 — Bunny.net Edge Scripting
Für wen: Traffic-starke Sites, die ein CDN-Edge näher am Besucher möchten (geringere Latenz + Entlastung des Ursprungsservers).
Europäische Präsenz: Bunny.net wird von BunnyWay d.o.o. in Slowenien betrieben. Wenn das Routing möglichst nah an Europa bleiben soll, begrenzen Sie die Pricing Zones bei der Einrichtung auf Europe.
Preise: ~0,01 €/Million Edge-Script-Anfragen + ~0,005 €/GB CDN-Bandbreite. Bei 1 Mio. Pageviews/Monat ca. 5 € gesamt. Kein Mindestabonnement, nutzungsbasierte Abrechnung.
Schritte:
- Konto erstellen auf bunny.net (Kreditkarte, ~5 € kostenloses Startguthaben).
- Eine „Pull Zone" erstellen:
- Tab _CDN_ → Schaltfläche _Add Pull Zone_
- Name:
ihrsite-snorklee(frei wählbar) - Origin URL:
https://snorklee.com - Pricing tier: Standard
- Pricing zones: Sie können nur Europe belassen, wenn Routing und Kosten auf diese Zone begrenzt bleiben sollen
- Domain per CNAME verbinden:
- Tab _Hostnames_ → _Add Hostname_ →
flow.ihrsite.com - Bei Ihrem DNS-Registrar (Gandi, OVH usw.):
CNAME flow.ihrsite.com → ihrsite-snorklee.b-cdn.netanlegen - 5 Minuten warten, zurück zu Bunny → auf _Generate Free SSL Certificate_ klicken (automatisches Let's Encrypt)
- Pfad zuordnen:
- Tab _Edge Rules_ → _Add Edge Rule_
- Action: _Override URL_
- Match:
Request URL contains "/js/flow.js" - Override URL:
https://snorklee.com/w.js - Speichern
- Finales Snippet:
<script defer src="https://flow.ihrsite.com/js/flow.js" data-site="ihrsite.com"></script>
Alle /api/*-Pfade werden automatisch über die Pull Zone an snorklee.com/api/* weitergeleitet.
Hinweis IP-Besucher: Bunny fügt X-Forwarded-For standardmäßig korrekt hinzu. Prüfen Sie im snorklee-Dashboard im Tab _Dashboard_ (Bereich Publikum, Karte Länder), dass die Länder nach 1–2 Stunden korrekt erscheinen.
Rezept 5 — Next.js / Nuxt Rewrites
Für wen: Sites mit modernem JavaScript-Stack, deren Hoster Rewrites oder Server-Routen unterstützt.
Hosting: Prüfen Sie, dass Ihre Plattform die nützlichen Header (X-Forwarded-For, HTTP-Methode, User-Agent, Accept-Language) beibehält und dass die gewählte Ausführungsregion zu Ihren Datenschutz- und Performance-Anforderungen passt.
Mögliche Optionen sind klassisches Node/SSR-Hosting, Serverless mit expliziter Region, ein Docker-Container oder eine Frontend-Plattform mit serverseitigen Rewrites.
Next.js — in next.config.js:
module.exports = {
async rewrites() {
return [
{
source: '/js/flow.js',
destination: 'https://snorklee.com/w.js',
},
{
source: '/api/event',
destination: 'https://snorklee.com/api/event',
},
{
source: '/api/ping',
destination: 'https://snorklee.com/api/ping',
},
{
source: '/api/zone',
destination: 'https://snorklee.com/api/zone',
},
];
},
};
Nuxt 3 — in nuxt.config.ts:
export default defineNuxtConfig({
routeRules: {
'/js/flow.js': { proxy: 'https://snorklee.com/w.js' },
'/api/event': { proxy: 'https://snorklee.com/api/event' },
'/api/ping': { proxy: 'https://snorklee.com/api/ping' },
'/api/zone': { proxy: 'https://snorklee.com/api/zone' },
},
});
Next/Nuxt-Rewrites erhalten X-Forwarded-For und die HTTP-Methode automatisch. POST-Events werden korrekt weitergeleitet.
Hoster auswählen
Der First-Party-Proxy funktioniert mit vielen Hostern. Prüfen Sie vor der Auswahl einer Plattform insbesondere:
- die Ausführungsregion, die der Proxy tatsächlich nutzt;
- die Aufbewahrungsdauer der Logs beim Hoster;
- die korrekte Weitergabe von
X-Forwarded-For; - die Möglichkeit, unnötige Cookies oder Header zu entfernen;
- die vertraglichen Zusagen, die Sie für Ihre eigene Privacy-Policy benötigen.
Überprüfen, ob alles funktioniert
- Das Skript lädt — öffnen Sie
https://ihrsite.com/js/flow.jsin Ihrem Browser; Sie sollten den minimierten Tracker-Code sehen (beginnt mit!function()...). - Events werden gesendet — öffnen Sie DevTools (F12) → Tab _Network_, navigieren Sie auf Ihrer Website. Sie sollten eine Anfrage
POST /api/eventsehen, die mit204 No Contentantwortet. - Geolokalisierung funktioniert — melden Sie sich im snorklee-Dashboard an, warten Sie 1–2 Minuten und prüfen Sie die Karte _Länder_ im Tab _Dashboard_ (Bereich Publikum). Wenn alle Besucher vom Land Ihres Proxy-Servers statt aus ihrem echten Land stammen, wird
X-Forwarded-Fornicht weitergeleitet. Überprüfen Sie die Proxy-Konfiguration. - Tracker im Tab Integration des Dashboards — die HTTP-Sonde „Installation testen" erkennt automatisch den Self-Host-Modus und zeigt _„1st-party-Proxy erkannt"_ im Ergebnis an.
Häufig gestellte Fragen
Verlangsamt der Proxy meine Website? Nein, oder nur marginal. Der Tracker flow.js ist ≈ 2 KB gzip und bleibt im Browser-Cache. Events werden über das nicht-blockierende sendBeacon gesendet und sind für den Besucher unsichtbar, selbst wenn der Proxy 50 ms Latenz hinzufügt.
Was passiert, wenn mein Proxy ausfällt? Events gehen während des Ausfalls verloren (keine Offline-Queue — aus Prinzip gemäß §25 TDDDG / DSGVO-Datensparsamkeit). Die Website funktioniert weiterhin normal; nur die Besuchermessung pausiert. Wie bei jedem anderen ausgefallenen Drittanbieter-Dienst (Google Analytics, Plausible usw.).
Kann ich nur das Skript proxieren und nicht die API? Ja, mit dem Attribut data-api:
<script defer src="/js/flow.js" data-site="ihrsite.com" data-api="https://snorklee.com"></script>
Das Skript wird 1st-party ausgeliefert (umgeht dateinamenbasierte Blocker), aber Events gehen direkt zu snorklee.com (werden von domainbasierten Blockern erneut blockiert). Weniger effektiv als das vollständige Rezept — hier nur für Sonderfälle dokumentiert.
Was, wenn ich später den Analytics-Anbieter wechseln möchte? Die Proxy-Struktur bleibt gleich; Sie ändern nur die Ziel-Domains. Das Snippet <script src="/js/flow.js" data-site="..."> ist universell.
Hilfe benötigt?
- 🛠️ Tab _Integration_ im Dashboard → Schaltfläche _Installation testen_ (automatische HTTP-Sonde)
- 📧 DSB/Support-Kontakt: siehe Tab _Konformität_ im Dashboard
- 📚 Vollständige Dokumentation: /docs