Proxy do Flowsery Analytics com Firebase Hosting
Encaminhe o Flowsery Analytics através do Firebase Hosting usando Cloud Functions para evitar interferência de bloqueadores de anúncios e capturar dados de visitantes mais precisos.
Nota: o Firebase Hosting não suporta nativamente rewrites de reverse proxy para destinos externos. Este guia usa Firebase Cloud Functions como alternativa.
1. Inicializar Firebase Functions (se ainda não estiver configurado)
Se o seu projeto ainda não inclui Firebase Functions, execute:
firebase init functionsSiga os passos de configuração adequados ao seu ambiente. No final, existirá um diretório /functions no seu projeto.
2. Instalar dependências
Entre no diretório functions/ e instale os pacotes necessários:
cd functions/
npm i -s express express-http-proxy3. Construir a Cloud Function de reverse proxy
Crie ou atualize functions/index.js com o seguinte:
const { onRequest } = require('firebase-functions/v2/https');
const express = require('express');
const proxy = require('express-http-proxy');
const app = express();
app.set('trust proxy', true);
// Proxy the Flowsery Analytics tracking script
app.use(
'/js/main.js',
proxy('https://analytics.flowsery.com', {
proxyReqPathResolver: () => '/js/main.js',
})
);
// Proxy the event collection endpoint
app.use(
'/api/track',
proxy('https://analytics.flowsery.com', {
proxyReqPathResolver: () => '/analytics/events',
proxyReqOptDecorator: (proxyReqOpts, srcReq) => {
// Forward the real visitor IP for accurate geolocation
const clientIp =
srcReq.headers['cf-connecting-ip'] || srcReq.headers['x-real-ip'] || srcReq.headers['x-forwarded-for']?.split(',')[0]?.trim() || srcReq.ip;
proxyReqOpts.headers['x-forwarded-for'] = clientIp;
if (clientIp) {
// CRITICAL: Flowsery reads this as the authoritative visitor IP. Without it, every visitor resolves to your server's region.
proxyReqOpts.headers['x-flowsery-real-ip'] = clientIp;
}
return proxyReqOpts;
},
})
);
exports.reverseProxy = onRequest(app);Nota: Se o seu projeto já usa uma rota /api/track, adicione data-api à tag de script do Flowsery Analytics para encaminhar eventos para outro caminho. Por exemplo, data-api="/flowsery-events" envia os dados para /flowsery-events.
Importante: Se todos os visitantes aparecerem na mesma localização no seu painel, confirme que o cabeçalho x-flowsery-real-ip está definido com o IP real do visitante (e não com o IP do servidor proxy) ao encaminhar pedidos para o endpoint /events do Flowsery Analytics.
4. Configurar os rewrites do Firebase Hosting
Atualize firebase.json para encaminhar os caminhos correspondentes para a função reverseProxy:
{
"hosting": {
"public": "public",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [
{
"source": "/js/main.js",
"function": "reverseProxy"
},
{
"source": "/api/track",
"function": "reverseProxy"
}
]
},
"functions": [
{
"source": "functions",
"codebase": "default",
"ignore": ["node_modules", ".git", "firebase-debug.log", "firebase-debug.*.log", "*.local"]
}
]
}5. Modificar a tag de script
Substitua o snippet original do Flowsery Analytics pela versão com proxy:
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>6. Fazer deploy do Hosting e das Functions
Publique hosting e functions num único deploy:
firebase deploy --only hosting,functionsConfirmar que funciona
Para validar que o proxy está a funcionar corretamente:
- Navegue até ao seu site
- Abra as ferramentas de desenvolvedor do navegador e mude para o separador Network
- Verifique que os pedidos de analytics são servidos a partir do seu domínio em vez de
analytics.flowsery.com
Resolução de problemas
Todos os visitantes aparecem da mesma localização
Quando todos os visitantes mostram uma única localização geográfica (normalmente a região do seu servidor), o proxy não está a encaminhar corretamente os IPs reais dos visitantes.
Resolução:
- Garanta que o seu proxy inclui o cabeçalho
x-flowsery-real-ipcom o endereço IP real do visitante (e não o IP do servidor) ao encaminhar pedidos para o endpoint/eventsdo Flowsery Analytics. - Se a Cloud Function estiver atrás de outro proxy (Cloudflare, Vercel, etc.),
srcReq.ipserá o proxy a montante. Use diretamentecf-connecting-ipoux-real-ip.