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

Servire il codice Snorklee dal tuo dominio (anti-blocco)

Chrome 121+, uBlock Origin, Brave Shields, AdGuard e la maggior parte dei blocchi pubblicitari bloccano per impostazione predefinita qualsiasi chiamata verso un dominio esterno etichettato come "analytics" — anche quando il servizio non fa alcuna pubblicità né alcun tracking pubblicitario, come nel nostro caso.

Se non fai nulla, perdi già oggi dal 5 al 20% delle tue visite, e questa quota salirà al 30-50% nei prossimi 12-24 mesi, quando Chrome estenderà la sua Tracking Protection a tutte le sessioni (non solo alla navigazione privata).

La soluzione: servire il codice Snorklee e l'API dal tuo dominio. Il browser vede allora una chiamata "1st-party", indistinguibile dal caricamento di un'immagine o di un foglio di stile. E questa, nessun blocco la blocca.

Questa pagina ti mostra come, con configurazioni first-party adatte a un'infrastruttura europea. Scegli hosting e regione di esecuzione in base alle tue esigenze di conformità, performance e supporto.

WordPress — passa dal plugin ufficiale

Su WordPress, non metterti a configurare Nginx, Caddy o il DNS. Il plugin ufficiale Snorklee Analytics 2.3.4+ fa già tutto il lavoro:

  1. Installa o aggiorna il plugin dalla dashboard Snorklee o dalla pagina Plugin WordPress Snorklee.
  2. In wp-admin, apri Snorklee.
  3. Verifica il dominio del sito e lascia l'URL dashboard su https://snorklee.com, salvo istanza self-hosted.
  4. Abilita Self-host mode e salva.
  5. Avvia Testa installazione. Il risultato deve indicare self-host o proxy 1st-party rilevato.

Il plugin serve /js/flow.js da WordPress, inoltra /api/event e /api/ping, tiene il codice JavaScript in cache per 1 ora (via Transients API) e non memorizza alcun evento in WordPress.


Come funziona — schema generale

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

┌──────────────────────────────────────────────────────────────────────────┐
│                                                                          │
│   DOPO (1st-party via il tuo proxy, mai bloccato)                        │
│   ────────────────────────────────────────────                           │
│                                                                          │
│   navigatore ──► <script src="/js/flow.js"> su miosito.com               │
│                  ✅ servito dal tuo proxy da snorklee.com             │
│                                                                          │
│   navigatore ──► POST miosito.com/api/event                              │
│                  ✅ inoltrato dal tuo proxy verso snorklee.com        │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

Inoltri lo script e 2 endpoint API dal tuo dominio verso snorklee.com:

Percorso sul tuo dominioDestinazione su snorkleeRuolo
/js/flow.jssnorklee.com/w.jsScript del tracker
/api/eventsnorklee.com/api/eventPageview + eventi personalizzati
/api/pingsnorklee.com/api/pingHeartbeat "live" ogni 30 s

Il codice da incollare nell'<head> diventa:

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

Tutti i percorsi sono 1st-party: visto dal browser, nulla esce verso un dominio esterno. È il tuo proxy che, lato server, fa da ponte con snorklee.com senza che il visitatore se ne accorga.

Quanto costa il relay — l'indirizzo del visitatore: quando il tuo server inoltra /api/event, vediamo lui, mai il browser. L'indirizzo che trasmetti in X-Forwarded-For ci arriva, ma ci rifiutiamo di geolocalizzarlo: su un punto d'ingresso pubblico chiunque potrebbe dichiarare l'indirizzo che vuole. Su un'installazione con relay non ci sono quindi né paese né regione, e i visitatori unici diventano poco affidabili (sono derivati proprio da quell'indirizzo: visitatori distinti si fondono in uno). Non è l'unica misura toccata: la chiave di visita deriva proprio da quell'indirizzo, quindi anche l'attribuzione delle sorgenti, la distinzione diretto/IA, i visitatori in tempo reale e l'engagement diventano poco affidabili, e il tetto anti-abuso (50 richieste al minuto per indirizzo) si applica ora a tutto il tuo sito in una volta. Le pagine viste e i passaggi dei robot restano invece contati. Snorklee te lo segnala nella coda delle decisioni invece di disegnare una mappa falsa. Tieni comunque X-Forwarded-For nelle ricette qui sotto: è ciò che permette di verificare l'identità dei robot IA. Se la mappa conta più dell'anti-blocco, inoltra solo lo script (vedi le FAQ in fondo alla pagina).

Ricetta 1 — Nginx (la più universale)

Funziona su: qualsiasi VPS Linux (OVH, Scaleway, Hetzner, Clever Cloud con runtime Nginx, IONOS, Infomaniak, ecc.).

Sovranità: neutrale (dipende dal tuo provider; scegli UE).

Aggiungi questo blocco nel tuo file di configurazione Nginx, all'interno del server { ... } che serve il tuo sito (tipicamente /etc/nginx/sites-available/miosito.conf):

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

Poi testa e ricarica:

sudo nginx -t && sudo systemctl reload nginx

Per verificare: apri https://miosito.com/js/flow.js nel tuo browser — dovresti vedere il codice Snorklee minificato. Se ottieni un errore 502, verifica che proxy_ssl_server_name on; sia presente (obbligatorio per il SNI verso snorklee.com).


Ricetta 2 — Caddy (la più semplice)

Funziona su: qualsiasi server dove Caddy è in esecuzione (auto-TLS incluso).

Sovranità: neutrale (dipende dal tuo provider).

Nel tuo Caddyfile, all'interno del blocco del tuo sito:

miosito.com {
    # ... la tua configurazione esistente ...

    # snorklee — proxy 1st-party (anti-blocco)
    @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
        }
    }
}

Poi:

caddy reload --config /etc/caddy/Caddyfile
Sintassi Caddy 2.6+: si usa un matcher con nome (@snorkleeApi path …) per applicare handle a più percorsi. La forma handle /a /b /c { … } non è accettata dal parser e fa fallire caddy validate.
Caddy inietta X-Forwarded-For e X-Real-IP automaticamente, quindi non è necessario dichiararli esplicitamente come con Nginx.

Ricetta 3 — Apache (mod_proxy)

Funziona su: hosting condiviso OVH, Infomaniak, IONOS, e qualsiasi server Apache con mod_proxy attivato. Utile per siti WordPress su cPanel senza accesso root.

Sovranità: neutrale.

Nel tuo .htaccess (alla radice del sito) o <VirtualHost>:

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

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

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

# Preservare l'IP visitatore (setifempty per non sovrascrivere un XFF a monte
# se sei dietro un altro LB/reverse-proxy che ne imposta già uno)
ProxyPreserveHost Off
RequestHeader setifempty X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader setifempty X-Real-IP       "%{REMOTE_ADDR}s"

# Non trasmettere mai cookie di sessione lato visitatore
Header always unset Set-Cookie

Moduli da attivare sul server (tipicamente già attivi sugli host FR seri): mod_proxy, mod_proxy_http, mod_ssl, mod_rewrite, mod_headers.

Su OVH condiviso, richiedi l'attivazione al supporto se necessario — è gratuita e standard.


Ricetta 4 — Bunny.net Edge Scripting

Per chi: siti ad alto traffico che vogliono un CDN edge più vicino al visitatore (guadagno di latenza + scarico del server di origine).

Presenza europea: Bunny.net è gestito da BunnyWay d.o.o. in Slovenia. Se vuoi mantenere il routing vicino all'Europa, limita le zone di pricing a Europe durante la configurazione.

Prezzi: ~0,01 €/milione di richieste Edge Script + ~0,005 €/GB di banda CDN. Per 1M pageview/mese, conta ~5 € in totale. Nessun abbonamento minimo, pagamento a consumo.

Passaggi:

  1. Crea un account su bunny.net (carta di credito, ~5 € di credito iniziale gratuito).
  2. Crea una "Pull Zone":
  • Scheda CDN → pulsante Add Pull Zone
  • Name: miosito-snorklee (libero)
  • Origin URL: https://snorklee.com
  • Pricing tier: Standard
  • Pricing zones: puoi lasciare solo Europe se vuoi limitare routing e costi a quella zona
  1. Collega il tuo dominio via CNAME:
  • Scheda HostnamesAdd Hostnameflow.miosito.com
  • Presso il tuo registrar DNS (Gandi, OVH, ecc.): crea un record CNAME flow.miosito.com → miosito-snorklee.b-cdn.net
  • Attendi 5 min, torna su Bunny → clicca Generate Free SSL Certificate (Let's Encrypt automatico)
  1. Mappa il percorso:
  • Scheda Edge RulesAdd Edge Rule
  • Action: Override URL
  • Match: Request URL contains "/js/flow.js"
  • Override URL: https://snorklee.com/w.js
  • Salva
  1. Snippet finale:
<script defer src="https://flow.miosito.com/js/flow.js" data-site="miosito.com"></script>

Tutti i percorsi /api/* passano automaticamente verso snorklee.com/api/* tramite la Pull Zone.

Nota: Bunny trasmette X-Forwarded-For per impostazione predefinita, ed è ciò che permette di verificare l'identità dei robot IA. La mappa dei paesi resta invece vuota su qualsiasi installazione con relay — vedi il riquadro in cima alla pagina.

Ricetta 5 — Next.js / Nuxt rewrites

Per chi: siti con stack JavaScript moderno il cui hosting supporta rewrite o route server.

Hosting: verifica che la piattaforma conservi gli header utili (X-Forwarded-For, metodo HTTP, User-Agent, Accept-Language) e che la regione di esecuzione scelta corrisponda alle tue esigenze di privacy e performance.

Opzioni possibili: hosting Node/SSR classico, serverless con regione esplicita, container Docker o piattaforma frontend che espone rewrite lato server.

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' },
  },
});
I rewrites Next/Nuxt preservano automaticamente X-Forwarded-For e il metodo HTTP. Gli eventi POST vengono trasmessi correttamente.

Scegliere l'hosting

Il proxy first-party funziona con molti hosting. Prima di sceglierne uno, guarda soprattutto:

  • la regione di esecuzione realmente usata dal proxy;
  • il periodo di conservazione dei log lato hosting;
  • la trasmissione corretta di X-Forwarded-For (serve a verificare l'identità dei robot IA, non a localizzare i tuoi visitatori);
  • la possibilità di rimuovere cookie o header inutili;
  • gli impegni contrattuali necessari per la tua policy privacy.

Verifica che funzioni

  1. Lo script si carica — apri https://miosito.com/js/flow.js nel tuo browser: dovresti vedere il codice Snorklee minificato (inizia con !function()...).
  2. Gli eventi partono — apri DevTools (F12) → scheda Network, poi naviga nel tuo sito. Dovresti vedere una richiesta POST /api/event che risponde 204 No Content.
  3. Quello che non vedrai — su un'installazione con relay la card Paesi resta vuota e i visitatori unici sono approssimativi: è previsto, non è un errore di configurazione (vedi il riquadro in cima alla pagina). Oggi nessuna impostazione del proxy lo cambia.
  4. Il risultato nella scheda Integrazione — la sonda "Testa l'installazione" riconosce da sola la modalità self-host e mostra "Proxy 1st-party rilevato" nel risultato.

Domande frequenti

Il proxy rallenta il mio sito? No, o appena. Il codice flow.js pesa ≈ 2 KB gzip e resta nella cache del browser. Gli eventi /api/* partono tramite sendBeacon, che non blocca nulla: il visitatore non nota alcuna differenza, anche se il proxy aggiunge 50 ms.

E se il mio proxy va in panne? Gli eventi di quel periodo vanno persi (nessuna coda offline — è una scelta voluta, §25 TDDDG / minimizzazione GDPR). Il tuo sito, invece, continua a funzionare normalmente: si ferma solo la misurazione dell'audience. Come qualsiasi altro servizio di terze parti in panne (Google Analytics, Plausible, ecc.).

Posso inoltrare solo lo script e non l'API? Sì, con l'attributo data-api:

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

Lo script viene servito in 1st-party (sfugge ai blocchi che filtrano sul nome del file), ma gli eventi ripartono direttamente verso snorklee.com, dove i blocchi che filtrano sul dominio li ribloccano. È un compromesso, non una mezza misura: perdi la quota di visite bloccate e in cambio conservi il paese dei tuoi visitatori e visitatori unici affidabili — cosa che il relay completo non può restituire.

E se voglio cambiare strumento di analytics in seguito? La struttura del proxy non cambia: modifichi soltanto i domini di destinazione. Il codice <script src="/js/flow.js" data-site="..."> resta lo stesso ovunque.


Hai bisogno di aiuto?

  • 🛠️ Scheda Integrazione della dashboard → pulsante Testa l'installazione (sonda HTTP automatica)
  • 📧 Contatto protezione dati/supporto: vedi la scheda Conformità della dashboard
  • 📚 Documentazione completa: /docs