Fastly
La diffusion en temps réel des journaux de Fastly peut envoyer les journaux de requêtes de votre service à Ahrefs via HTTPS. Vous ajoutez un point de terminaison de journalisation à votre service Fastly depuis le panneau de contrôle Fastly ; Ahrefs n’a jamais besoin d’accéder à votre compte Fastly.
Prérequis
- Un service CDN Fastly desservant le domaine de votre projet Ahrefs. Tous les forfaits Fastly conviennent, y compris la version gratuite.
- Autorisation de modifier la configuration de ce service et d’activer une nouvelle version.
Étape 1 — Obtenir votre clé d’accès
- Dans Ahrefs, accédez à Paramètres du projet → Bot Analytics pour votre projet.
- Sélectionnez Fastly.
- Copiez l’URL, le nom d’en-tête personnalisé et la valeur d’en-tête personnalisée. La valeur de l’en-tête est votre clé d’accès : elle identifie votre projet, traitez-la donc comme un mot de passe.
Tout le reste dont vous avez besoin se trouve sur cette page.
Étape 2 — Ajouter le point de terminaison de journalisation
Dans le panneau de contrôle Fastly, ouvrez votre service, cliquez sur Modifier la configuration et clonez la version active. Dans le menu de gauche, choisissez Journalisation, puis HTTPS et Créer un point de terminaison.
Champs du point de terminaison
| Champ | Valeur |
|---|---|
| Nom | Ahrefs Bot Analytics |
| Placement | Version du format par défaut |
| Format des journaux | Le format des journaux ci-dessous, en remplacement du format par défaut |
| URL | https://analytics.ahrefs.com/api/fastly/logs |
| Nombre maximal de journaux, Nombre maximal d’octets | Laissez vide |
| Type de contenu | application/json |
| Nom de l’en-tête personnalisé | X-Ahrefs-Web-Analytics-Property |
| Valeur de l’en-tête personnalisé | La clé d’accès de l’étape 1 |
| Méthode | POST |
| Format de l’entrée de journal JSON | Délimité par des sauts de ligne. Un tableau JSON fonctionne aussi. |
| Compression | Gzip (recommandé) ou aucune. Zstd et Snappy ne sont pas acceptés. |
| Champs TLS | Laissez vide |
Dans Options avancées, définissez Sélectionner un format de ligne de journal sur Vide. Cliquez sur Créer, puis sur Activer pour activer la nouvelle version. Fastly commence à diffuser immédiatement.
warning
Le format de ligne de journal doit être Vide. Le format par défaut, Classique, ajoute un en-tête syslog au début de chaque ligne, et Ahrefs rejette ces lots.
info
Lorsque vous enregistrez le point de terminaison, Fastly vérifie que l’hôte de destination accepte les journaux provenant des services Fastly. Ahrefs répond à cette vérification pour tout le monde, vous n’avez donc rien à configurer de votre côté.
Format des journaux
Fastly renseigne les espaces réservés %{...}V pour chaque requête. C’est vous qui décidez quoi partager : le format minimal suffit pour que Bot Analytics fonctionne, le format recommandé donne de meilleurs résultats. Les clés inconnues sont ignorées, vous pouvez donc conserver les champs supplémentaires que vous journalisez déjà.
Minimal. Visites de bots avec l’heure, la page et le nom du bot :
{
"timestamp": %{time.start.msec}V,
"host": "%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V",
"url": "%{json.escape(req.url)}V",
"request_user_agent": "%{json.escape(req.http.User-Agent)}V"
}
Recommandé. Ajoute l’IP du visiteur pour les données de localisation, le statut et les détails de réponse affichés avec chaque visite, la vérification Web Bot Auth, ainsi que le marqueur edge qui supprime les doublons lorsque votre service utilise un shield :
{
"timestamp": %{time.start.msec}V,
"client_ip": "%{req.http.Fastly-Client-IP}V",
"host": "%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V",
"scheme": "%{req.protocol}V",
"url": "%{json.escape(req.url)}V",
"request_method": "%{json.escape(req.method)}V",
"request_referer": "%{json.escape(req.http.Referer)}V",
"request_user_agent": "%{json.escape(req.http.User-Agent)}V",
"response_state": "%{json.escape(fastly_info.state)}V",
"response_status": %{resp.status}V,
"response_body_size": %{resp.body_bytes_written}V,
"response_content_type": "%{json.escape(resp.http.Content-Type)}V",
"fastly_server": "%{json.escape(server.identity)}V",
"fastly_is_edge": %{if(fastly.ff.visits_this_service == 0, "true", "false")}V,
"request_id": "%{json.escape(req.xid)}V",
"signature": "%{json.escape(req.http.Signature)}V",
"signature_input": "%{json.escape(req.http.Signature-Input)}V",
"signature_agent": "%{json.escape(req.http.Signature-Agent)}V"
}
Combinez les deux comme vous le souhaitez : les quatre clés minimales sont obligatoires ; toutes les autres clés peuvent être omises, vides ou égales à (null). Conservez fastly_is_edge lorsque votre service utilise un shield, sinon chaque miss est compté deux fois. Les clés sans guillemets (timestamp, response_status, response_body_size, fastly_is_edge) doivent toujours avoir une valeur ; sinon, la ligne n’est pas du JSON valide.
info
Les services Fastly Compute écrivent le même JSON depuis le code, un objet par ligne, avec les paramètres du point de terminaison de l’étape 2.
Étape 3 — Vérifier
Fastly transmet les journaux par petits lots, généralement dans la minute suivant les requêtes. Les visites de bots apparaissent ensuite dans le rapport Bot Analytics quelques minutes plus tard. Les requêtes provenant des navigateurs sont également envoyées ; Ahrefs écarte tout ce qui n’est pas un bot.
Dépannage
Fastly n’affiche pas les erreurs de livraison pour les points de terminaison HTTPS dans le panneau de contrôle. Vérifiez donc les paramètres à l’aide du tableau ci-dessus si rien n’arrive. Ahrefs répond à chaque lot par l’une de ces réponses :
| Réponse | Cause |
|---|---|
401 missing authentication header | Le nom de l’en-tête personnalisé est mal orthographié ou vide. |
403 invalid authentication | La valeur de l’en-tête personnalisé ne correspond à aucun projet Ahrefs. Copiez-la à nouveau depuis l’étape 1. |
400 record 0: … | Le format des lignes de journaux est Classique au lieu de Vide, la compression n’est ni au format Gzip ni désactivée, ou le format des journaux n’est pas du JSON valide. |
400 record N: Missing record field … | Délimité par des retours à la ligne : le format des journaux ne contient pas l’une des clés requises. |
400 invalid body: not a JSON array of log records: … | Tableau JSON : le format des lignes de journaux est Classique au lieu de Vide, il manque une clé requise au format des journaux, ou celui-ci n’est pas du JSON valide. |
400 body is not valid gzip | La compression est définie sur Gzip dans Fastly, mais le corps n’a pas pu être décompressé. |