Aller au contenu
snorklee
Trafic IA Analytics Tarifs Manifeste Documentation Contact Connexion Essai gratuit 14 jours

De Snorklee-code vanuit uw eigen domein serveren (anti-blokkering)

Chrome 121+, uBlock Origin, Brave Shields, AdGuard en de meeste advertentieblokkeerders blokkeren standaard elke oproep naar een extern domein met het label "analytics" — zelfs wanneer de dienst geen reclame en geen advertentietracking doet, wat bij ons het geval is.

Als u niets doet, verliest u vandaag al 5 tot 20 % van uw bezoeken, en dat aandeel stijgt naar 30–50 % binnen 12 tot 24 maanden, zodra Chrome zijn Tracking Protection uitbreidt naar alle sessies (niet alleen privévensters).

De oplossing: de Snorklee-code en de API serveren vanuit uw eigen domein. De browser ziet dan een "1st-party"-oproep, niet te onderscheiden van het laden van een afbeelding of een stylesheet. En die blokkeert geen enkele blokkeerder.

Deze pagina laat u zien hoe, met first-party configuraties die passen bij een Europese infrastructuur. Kies host en uitvoeringsregio volgens uw behoeften rond compliance, performance en support.

WordPress — ga via de officiële plugin

Waag u op WordPress niet aan Nginx, Caddy of DNS. De officiële Snorklee Analytics-plugin 2.3.4+ doet al het werk al:

  1. Installeer of update de plugin vanuit het Snorklee-dashboard of via de pagina Snorklee WordPress-plugin.
  2. Open Snorklee in wp-admin.
  3. Controleer het sitedomein en laat de dashboard-URL op https://snorklee.com, behalve bij een self-hosted instantie.
  4. Activeer Self-host mode en sla op.
  5. Start Installatie testen. Het resultaat moet self-host of 1st-party proxy gedetecteerd vermelden.

De plugin serveert /js/flow.js vanuit WordPress, stuurt /api/event en /api/ping door, houdt de JavaScript 1 uur in cache (via de Transients API) en slaat geen enkel event op in WordPress.


Hoe het werkt — algemeen schema

┌──────────────────────────────────────────────────────────────────────────┐
│                                                                          │
│   VOOR (3rd-party, geblokkeerd)                                          │
│   ──────────────────────────────                                         │
│                                                                          │
│   browser ──► <script src="https://snorklee.com/w.js">                │
│               ❌ ERR_BLOCKED_BY_CLIENT                                    │
│                                                                          │
│   browser ──► POST https://snorklee.com/api/event                     │
│               ❌ ERR_BLOCKED_BY_CLIENT                                    │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────────────┐
│                                                                          │
│   NA (1st-party via uw proxy, nooit geblokkeerd)                         │
│   ─────────────────────────────────────────────                          │
│                                                                          │
│   browser ──► <script src="/js/flow.js"> op uwsite.com                   │
│               ✅ geserveerd door uw proxy vanuit snorklee.com         │
│                                                                          │
│   browser ──► POST uwsite.com/api/event                                  │
│               ✅ doorgestuurd door uw proxy naar snorklee.com         │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

U stuurt het script en 2 API-endpoints van uw domein door naar snorklee.com:

Pad op uw domeinDoel bij snorkleeRol
/js/flow.jssnorklee.com/w.jsTrackerscript
/api/eventsnorklee.com/api/eventPaginaweergaven + aangepaste events
/api/pingsnorklee.com/api/pingHeartbeat "live" elke 30 s

De code die u in uw <head> plakt, wordt:

<script defer src="/js/flow.js" data-site="uwsite.com"></script>

Alle paden zijn 1st-party: vanuit de browser gezien verlaat niets het domein. Het is uw proxy die aan de serverzijde ongemerkt de brug slaat naar snorklee.com — de bezoeker merkt er niets van.

Wat doorsturen kost — het adres van de bezoeker: wanneer uw server /api/event doorstuurt, zien wij hém, nooit de browser. Het adres dat u in X-Forwarded-For meegeeft, bereikt ons wel, maar wij weigeren het te verorten: op een openbaar eindpunt kan iedereen elk gewenst adres beweren. Op een doorgestuurde installatie is er daarom geen land en geen regio, en worden de unieke bezoekers onbetrouwbaar (ze worden uit datzelfde adres afgeleid, waardoor verschillende bezoekers samenvallen). Dat is niet de enige meting die eronder lijdt: de bezoeksleutel wordt uit datzelfde adres afgeleid, dus ook de bronattributie, het onderscheid direct/AI, de live bezoekers en de betrokkenheid worden onbetrouwbaar, en de misbruiklimiet (50 verzoeken per minuut per adres) geldt nu in één klap voor uw hele site. Paginaweergaven en robotbezoeken worden wel gewoon geteld. Snorklee meldt het u in de beslissingslijst in plaats van een valse kaart te tekenen. Houd X-Forwarded-For in de recepten hieronder toch aan: daarmee controleren wij de identiteit van AI-robots. Telt de kaart voor u zwaarder dan het omzeilen van blokkeerders, stuur dan alleen het script door (zie de FAQ onder aan deze pagina).

Recept 1 — Nginx (de meest universele)

Werkt op: elke Linux-VPS (OVH, Scaleway, Hetzner, Clever Cloud met Nginx-runtime, IONOS, Infomaniak, enz.).

Soevereiniteit: neutraal (afhankelijk van uw hostingprovider; kies EU).

Voeg dit blok toe binnen het server { ... }-blok dat uw site serveert (doorgaans /etc/nginx/sites-available/uwsite.conf):

# snorklee — 1st-party proxy (anti-blokkering)
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)$ {
    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;
}

Test en herlaad vervolgens:

sudo nginx -t && sudo systemctl reload nginx

Om te controleren: open https://uwsite.com/js/flow.js in uw browser — u zou de geminimaliseerde Snorklee-code moeten zien. Bij een 502-fout controleert u of proxy_ssl_server_name on; aanwezig is (verplicht voor SNI naar snorklee.com).


Recept 2 — Caddy (de eenvoudigste)

Werkt op: elke server waarop Caddy draait (inclusief automatische TLS).

Soevereiniteit: neutraal (afhankelijk van uw hostingprovider).

In uw Caddyfile, binnen het blok van uw site:

uwsite.com {
    # ... uw bestaande configuratie ...

    # snorklee — 1st-party proxy (anti-blokkering)
    @snorkleeApi path /api/event /api/ping

    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
        }
    }
}

Vervolgens:

caddy reload --config /etc/caddy/Caddyfile
Caddy 2.6+-syntaxis: gebruik een benoemde matcher (@snorkleeApi path …) om handle op meerdere paden toe te passen. De vorm handle /a /b /c { … } wordt niet geaccepteerd door de parser en doet caddy validate mislukken.
Caddy injecteert X-Forwarded-For en X-Real-IP automatisch — u hoeft deze niet expliciet te declareren zoals bij Nginx.

Recept 3 — Apache (mod_proxy)

Werkt op: gedeelde hosting van OVH, Infomaniak, IONOS en elke Apache-server met mod_proxy ingeschakeld. Handig voor WordPress-sites op cPanel zonder root-toegang.

Soevereiniteit: neutraal.

In uw .htaccess (in de root van de site) of <VirtualHost>:

# snorklee — 1st-party proxy (anti-blokkering)
SSLProxyEngine On

# Het script
RewriteEngine On
RewriteRule ^js/flow\.js$ https://snorklee.com/w.js [P,L]

# De API
RewriteRule ^api/(event|ping)$ https://snorklee.com/api/$1 [P,L]

# Bewaar het IP-adres van de bezoeker (setifempty overschrijft geen upstream XFF
# als u achter een andere LB/reverse-proxy zit die er al een instuurt)
ProxyPreserveHost Off
RequestHeader setifempty X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader setifempty X-Real-IP       "%{REMOTE_ADDR}s"

# Nooit een sessiecookie aan de bezoekerskant doorsturen
Header always unset Set-Cookie

Te activeren modules op de server (doorgaans al actief bij serieuze EU-hosters): mod_proxy, mod_proxy_http, mod_ssl, mod_rewrite, mod_headers.

Bij OVH gedeelde hosting kunt u activering via de support aanvragen — dit is gratis en standaard.


Recept 4 — Bunny.net Edge Scripting

Voor wie: sites met veel verkeer die een CDN-edge dichter bij de bezoeker willen (lagere latentie + minder belasting van de oorsprongsserver).

Europese aanwezigheid: Bunny.net wordt beheerd door BunnyWay d.o.o. in Slovenië. Als u de routing dicht bij Europa wilt houden, beperk de pricing zones dan tijdens de configuratie tot Europe.

Prijzen: ~€ 0,01 per miljoen Edge Script-verzoeken + ~€ 0,005 per GB CDN-bandbreedte. Voor 1 M paginaweergaven per maand rekent u op ~€ 5 totaal. Geen minimumabonnement, betaal per gebruik.

Stappen:

  1. Maak een account aan op bunny.net (creditcard, ~€ 5 gratis startkrediet).
  2. Maak een "Pull Zone" aan:
  • Tabblad CDN → knop Add Pull Zone
  • Name: mijnsite-snorklee (vrije keuze)
  • Origin URL: https://snorklee.com
  • Pricing tier: Standard
  • Pricing zones: u kunt alleen Europe aanhouden als u routing en kosten tot die zone wilt beperken
  1. Koppel uw domein via CNAME:
  • Tabblad HostnamesAdd Hostnameflow.uwsite.com
  • Bij uw DNS-registrar (Gandi, OVH, enz.): maak een CNAME flow.uwsite.com → mijnsite-snorklee.b-cdn.net aan
  • Wacht 5 minuten, keer terug naar Bunny → klik op Generate Free SSL Certificate (automatisch Let's Encrypt)
  1. Wijs het pad toe:
  • Tabblad Edge RulesAdd Edge Rule
  • Action: Override URL
  • Match: Request URL contains "/js/flow.js"
  • Override URL: https://snorklee.com/w.js
  • Sla op
  1. Definitief snippet:
<script defer src="https://flow.uwsite.com/js/flow.js" data-site="uwsite.com"></script>

Alle /api/*-paden worden automatisch doorgestuurd naar snorklee.com/api/* via de Pull Zone.

Opmerking: Bunny geeft X-Forwarded-For standaard correct door; daarmee controleren wij de identiteit van AI-robots. De landenkaart blijft op elke doorgestuurde installatie leeg — zie het kader boven aan deze pagina.

Recept 5 — Next.js / Nuxt rewrites

Voor wie: sites met een moderne JavaScript-stack waarvan de host rewrites of serverroutes ondersteunt.

Hosting: controleer dat uw platform de nuttige headers behoudt (X-Forwarded-For, HTTP-methode, User-Agent, Accept-Language) en dat de gekozen uitvoeringsregio past bij uw privacy- en performancebehoeften.

Mogelijke opties zijn klassieke Node/SSR-hosting, serverless met expliciete regio, een Docker-container of een frontendplatform met server-side 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',
      },
    ];
  },
};

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' },
  },
});
Next/Nuxt rewrites bewaren X-Forwarded-For en de HTTP-methode automatisch. POST-events worden correct doorgestuurd.

Uw host kiezen

De first-party proxy werkt met veel hosters. Voordat u er een kiest, let vooral op:

  • de uitvoeringsregio die de proxy werkelijk gebruikt;
  • de bewaartermijn van logs bij de hoster;
  • correcte doorgifte van X-Forwarded-For (dat controleert de identiteit van AI-robots; het lokaliseert uw bezoekers niet);
  • de mogelijkheid om onnodige cookies of headers te verwijderen;
  • de contractuele toezeggingen die u nodig hebt voor uw eigen privacybeleid.

Controleren of het werkt

  1. Het script wordt geladen — open https://uwsite.com/js/flow.js in uw browser: u zou de geminimaliseerde Snorklee-code moeten zien (begint met !function()...).
  2. De events worden verzonden — open DevTools (F12) → tabblad Network en klik op een pagina van uw site. U zou een verzoek POST /api/event moeten zien met de respons 204 No Content.
  3. Wat u niet zult zien — op een doorgestuurde installatie blijft de kaart Landen leeg en zijn de unieke bezoekers bij benadering: dat is verwacht en geen configuratiefout (zie het kader boven aan deze pagina). Geen enkele proxy-instelling verandert dat vandaag.
  4. Het resultaat in het tabblad Integratie — de sonde "Installatie testen" herkent de self-hostmodus vanzelf en toont "1st-party proxy gedetecteerd" in het resultaat.

Veelgestelde vragen

Vertraagt de proxy mijn site? Nee, of nauwelijks. De flow.js-code weegt ≈ 2 KB gzip en blijft gecacht in de browser. Events worden verzonden via sendBeacon, dat niets blokkeert — de bezoeker merkt geen verschil, zelfs als de proxy 50 ms toevoegt.

Wat als mijn proxy uitvalt? De events uit die periode gaan verloren (geen offline wachtrij — een bewuste keuze, §25 TDDDG / AVG-minimalisatie). Uw site zelf werkt gewoon door — alleen de publieksmeting pauzeert. Net als bij elke andere externe dienst die uitvalt (Google Analytics, Plausible, enz.).

Kan ik alleen het script doorsturen en niet de API? Ja, met het attribuut data-api:

<script defer src="/js/flow.js" data-site="uwsite.com" data-api="https://snorklee.com"></script>

Het script wordt als 1st-party geserveerd (het glipt langs blokkeerders die op bestandsnaam filteren), maar de events gaan rechtstreeks naar snorklee.com, waar blokkeerders die op domein filteren ze opnieuw blokkeren. Dit is een afweging, geen halve maatregel: u verliest het geblokkeerde deel van de bezoeken en houdt daarvoor het land van uw bezoekers en betrouwbare unieke bezoekers — iets wat volledig doorsturen niet kan teruggeven.

Wat als ik later van analytics-tool wil wisselen? De proxystructuur blijft gelijk: u verandert alleen de doeldomeinen. De code <script src="/js/flow.js" data-site="..."> blijft overal hetzelfde.


Hulp nodig?

  • 🛠️ Tabblad Integratie van het dashboard → knop Installatie testen (automatische HTTP-sonde)
  • 📧 Contact gegevensbescherming/support: zie het tabblad Conformiteit van het dashboard
  • 📚 Volledige documentatie: /docs