Assistance/Guides proxy
Guides proxy

Proxy Flowsery Analytics avec Laravel

Faites transiter Flowsery Analytics via votre application Laravel afin d'eviter les interferences des bloqueurs de publicites et de capturer des donnees visiteurs plus precises.

1. Generer le controleur proxy

Creez un controleur dedie pour gerer les requetes proxy :

Terminal
php artisan make:controller FlowseryProxyController

2. Implementer la logique proxy

Ajoutez le code suivant a app/Http/Controllers/FlowseryProxyController.php :

PHP
<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
 
class FlowseryProxyController extends Controller
{
    public function script()
    {
        // Cache the tracking script for 1 day
        return Cache::remember('flowsery_script', 86400, function () {
            $response = Http::get('https://cdn.flowsery.com/main.js');
            return response($response->body(), 200, [
                'Content-Type' => 'application/javascript',
                'Cache-Control' => 'public, max-age=86400'
            ]);
        });
    }
 
    public function events(Request $request)
    {
        // Determine the origin from the request or build it from the URL
        $origin = $request->header('Origin') ?? $request->getSchemeAndHttpHost();
 
        // Resolve the real visitor IP for accurate geolocation
        $clientIp = $request->header('CF-Connecting-IP')
            ?? $request->header('X-Real-IP')
            ?? $request->header('X-Forwarded-For')
            ?? $request->ip();
 
        if (str_contains($clientIp, ',')) {
            $clientIp = trim(explode(',', $clientIp)[0]);
        }
 
        $headers = [
            'User-Agent' => $request->header('User-Agent'),
            'Content-Type' => 'application/json',
            'Origin' => $origin,
            '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.
            $headers['x-flowsery-real-ip'] = $clientIp;
        }
 
        $response = Http::withHeaders($headers)
            ->post('https://analytics.flowsery.com/analytics/events', $request->all());
 
        return response($response->body(), $response->status());
    }
}

Remarque : si votre application utilise deja une route /api/track, ajoutez data-api a la balise script Flowsery Analytics pour envoyer les evenements vers un autre chemin. Par exemple, data-api="/flowsery-events" envoie les donnees vers /flowsery-events.

3. Enregistrer les routes

Ajoutez les lignes suivantes a routes/web.php :

PHP
Route::get('/js/main.js', [FlowseryProxyController::class, 'script']);
Route::post('/api/track', [FlowseryProxyController::class, 'events']);

4. Modifier la balise script

Remplacez le snippet Flowsery Analytics par la version proxifiee :

HTML
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>

5. Deployer

Apres le deploiement de votre application, la configuration proxy s'active automatiquement.

Verifier que cela fonctionne

Pour valider le bon fonctionnement du proxy :

  1. Ouvrez votre site web
  2. Ouvrez les outils de developpement de votre navigateur et passez a l'onglet Reseau
  3. Verifiez que les requetes analytics sont servies depuis votre domaine plutot que depuis analytics.flowsery.com

Depannage

Tous les visiteurs apparaissent au meme endroit

Lorsque tous les visiteurs affichent une seule localisation geographique (generalement la region de votre serveur), le proxy ne transmet pas correctement les vraies IP des visiteurs.

Resolution :

  1. Assurez-vous que votre proxy inclut l'en-tete x-flowsery-real-ip contenant la vraie adresse IP du visiteur (et non celle du serveur) lors du transfert des requetes vers le endpoint /events de Flowsery Analytics
  2. Si Laravel est derriere un autre proxy (Cloudflare, Vercel, etc.), $request->ip() sera l'IP du proxy amont : lisez plutot $request->header('CF-Connecting-IP') ou $request->header('X-Real-IP')