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:
- Installa o aggiorna il plugin dalla dashboard Snorklee o dalla pagina Plugin WordPress Snorklee.
- In wp-admin, apri Snorklee.
- Verifica il dominio del sito e lascia l'URL dashboard su
https://snorklee.com, salvo istanza self-hosted. - Abilita Self-host mode e salva.
- 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 dominio | Destinazione su snorklee | Ruolo |
|---|---|---|
/js/flow.js | snorklee.com/w.js | Script del tracker |
/api/event | snorklee.com/api/event | Pageview + eventi personalizzati |
/api/ping | snorklee.com/api/ping | Heartbeat "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 inX-Forwarded-Forci 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 comunqueX-Forwarded-Fornelle 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 applicarehandlea più percorsi. La formahandle /a /b /c { … }non è accettata dal parser e fa fallirecaddy validate.
Caddy iniettaX-Forwarded-ForeX-Real-IPautomaticamente, 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:
- Crea un account su bunny.net (carta di credito, ~5 € di credito iniziale gratuito).
- 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
- Collega il tuo dominio via CNAME:
- Scheda Hostnames → Add Hostname →
flow.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)
- Mappa il percorso:
- Scheda Edge Rules → Add Edge Rule
- Action: Override URL
- Match:
Request URL contains "/js/flow.js" - Override URL:
https://snorklee.com/w.js - Salva
- 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
- Lo script si carica — apri
https://miosito.com/js/flow.jsnel tuo browser: dovresti vedere il codice Snorklee minificato (inizia con!function()...). - Gli eventi partono — apri DevTools (F12) → scheda Network, poi naviga nel tuo sito. Dovresti vedere una richiesta
POST /api/eventche risponde204 No Content. - 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.
- 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