Stats : référents (d'où viennent les visiteurs) #94

Open
opened 2026-05-16 09:04:15 +00:00 by cedricAbonnel · 0 comments
Owner

Contexte

Les logs Apache au format COMBINED contiennent le champ Referer (7e champ), mais AccessLogParser ne le lit pas — son regex s'arrête après le code HTTP status. On n'a donc aucune visibilité sur l'origine du trafic : moteurs de recherche, liens externes, réseaux sociaux, trafic direct.

Ce qu'on veut

Un tableau "Provenance du trafic" dans /admin/stats listant les domaines référents classés par hits :

Provenance du trafic (14 derniers jours)
──────────────────────────────────────────────────
#  Domaine référent       Hits    Articles touchés
1  google.com              843    Post A, Post B…
2  hn.algolia.com           92    Post C
3  mastodon.social          41    Post A
4  (direct / inconnu)    1 205    —
──────────────────────────────────────────────────

Détail par référent (expand)

Comme pour les réseaux (ticket #92), chaque ligne est dépliable pour afficher les articles et livres qui ont reçu ce trafic référent.

Données disponibles

Le log Apache COMBINED :

IP - - [ts] "METHOD path HTTP/x" status bytes "REFERER" "UA"

Le champ REFERER est la 7e colonne. Il vaut - pour le trafic direct ou les requêtes sans en-tête Referer.

Travail technique

  1. AccessLogParser :

    • Étendre RE (ou parser le reste de la ligne après status+bytes) pour capturer le champ referer.
    • Extraire le domaine (parse_url($ref, PHP_URL_HOST)).
    • Ignorer les auto-référents (même domaine que le site) et les valeurs -.
    • Retourner referers: [domaine => hits] dans stats().
  2. Corrélation référent ↔ contenu : stocker referers_by_path: [domaine => [path => hits]] pour alimenter le sous-détail.

  3. Backend : alimenter $adminData['stats_referers'] dans l'action stats.

  4. Template : nouvelle section "Provenance" avec tableau et expand dépliable (même pattern que les tableaux réseau/pays du ticket #92).

  5. Cache : inclure dans le cache stats existant.

Points d'attention

  • Normalisation des domaines : www.google.fr, google.com, google.co.uk → à regrouper sous google.* ou à laisser bruts selon le besoin.
  • Referer spoofing : le champ est fourni par le client et peut être falsifié — l'afficher tel quel, sans prétendre à l'exactitude.
  • Trafic direct : regrouper - et les referers malformés sous une entrée "Direct / inconnu".

Critères d'acceptation

  • Section "Provenance" listant les domaines référents triés par hits
  • Auto-référents filtrés (le site lui-même n'apparaît pas)
  • Sous-détail dépliable : articles et livres touchés par chaque référent
  • Entrée "Direct / inconnu" pour le trafic sans Referer
  • Données cachées avec le reste des stats (TTL 10 min)

Lien

Complémentaire du ticket #92 (stats par réseau / pays / visiteur). Le champ UA (User-Agent), capturé au même endroit dans les logs, pourrait être traité dans le même chantier pour la détection bots.

## Contexte Les logs Apache au format COMBINED contiennent le champ **Referer** (7e champ), mais `AccessLogParser` ne le lit pas — son regex s'arrête après le code HTTP status. On n'a donc aucune visibilité sur l'origine du trafic : moteurs de recherche, liens externes, réseaux sociaux, trafic direct. ## Ce qu'on veut Un tableau **"Provenance du trafic"** dans `/admin/stats` listant les domaines référents classés par hits : ``` Provenance du trafic (14 derniers jours) ────────────────────────────────────────────────── # Domaine référent Hits Articles touchés 1 google.com 843 Post A, Post B… 2 hn.algolia.com 92 Post C 3 mastodon.social 41 Post A 4 (direct / inconnu) 1 205 — ────────────────────────────────────────────────── ``` ### Détail par référent (expand) Comme pour les réseaux (ticket #92), chaque ligne est dépliable pour afficher les articles et livres qui ont reçu ce trafic référent. ## Données disponibles Le log Apache COMBINED : ``` IP - - [ts] "METHOD path HTTP/x" status bytes "REFERER" "UA" ``` Le champ `REFERER` est la 7e colonne. Il vaut `-` pour le trafic direct ou les requêtes sans en-tête Referer. ## Travail technique 1. **`AccessLogParser`** : - Étendre `RE` (ou parser le reste de la ligne après status+bytes) pour capturer le champ referer. - Extraire le domaine (`parse_url($ref, PHP_URL_HOST)`). - Ignorer les auto-référents (même domaine que le site) et les valeurs `-`. - Retourner `referers: [domaine => hits]` dans `stats()`. 2. **Corrélation référent ↔ contenu** : stocker `referers_by_path: [domaine => [path => hits]]` pour alimenter le sous-détail. 3. **Backend** : alimenter `$adminData['stats_referers']` dans l'action stats. 4. **Template** : nouvelle section "Provenance" avec tableau et expand dépliable (même pattern que les tableaux réseau/pays du ticket #92). 5. **Cache** : inclure dans le cache stats existant. ## Points d'attention - **Normalisation des domaines** : `www.google.fr`, `google.com`, `google.co.uk` → à regrouper sous `google.*` ou à laisser bruts selon le besoin. - **Referer spoofing** : le champ est fourni par le client et peut être falsifié — l'afficher tel quel, sans prétendre à l'exactitude. - **Trafic direct** : regrouper `-` et les referers malformés sous une entrée "Direct / inconnu". ## Critères d'acceptation - [ ] Section "Provenance" listant les domaines référents triés par hits - [ ] Auto-référents filtrés (le site lui-même n'apparaît pas) - [ ] Sous-détail dépliable : articles et livres touchés par chaque référent - [ ] Entrée "Direct / inconnu" pour le trafic sans Referer - [ ] Données cachées avec le reste des stats (TTL 10 min) ## Lien Complémentaire du ticket #92 (stats par réseau / pays / visiteur). Le champ UA (User-Agent), capturé au même endroit dans les logs, pourrait être traité dans le même chantier pour la détection bots.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/folio#94