Fastly
La transmisión en tiempo real de registros de Fastly puede enviar los registros de solicitudes de tu servicio a Ahrefs a través de HTTPS. Añade un punto de conexión de registro a tu servicio de Fastly desde el panel de control de Fastly; Ahrefs nunca necesita acceder a tu cuenta de Fastly.
Requisitos previos
- Un servicio CDN de Fastly que da servicio al dominio de tu proyecto de Ahrefs. Cualquier plan de Fastly funciona, incluido el nivel gratuito.
- Permiso para editar la configuración de ese servicio y activar una nueva versión.
Paso 1 — Obtén tu clave de acceso
- En Ahrefs, ve a Configuración del proyecto → Bot Analytics de tu proyecto.
- Selecciona Fastly.
- Copia la URL, el nombre del encabezado personalizado y el valor del encabezado personalizado. El valor del encabezado es tu clave de acceso: identifica tu proyecto, así que trátalo como una contraseña.
Todo lo demás que necesitas está en esta página.
Paso 2 — Añade el punto de conexión de registro
En el panel de control de Fastly, abre tu servicio, haz clic en Editar configuración y clona la versión activa. En el menú de la izquierda, elige Registro, luego HTTPS y Crear punto de conexión.
Campos del punto de conexión
| Campo | Valor |
|---|---|
| Nombre | Ahrefs Bot Analytics |
| Asignación | Versión de formato predeterminada |
| Formato de registro | El formato de registro de abajo, sustituyendo el predeterminado |
| URL | https://analytics.ahrefs.com/api/fastly/logs |
| Registros máximos, bytes máximos | Dejar en blanco |
| Tipo de contenido | application/json |
| Nombre del encabezado personalizado | X-Ahrefs-Web-Analytics-Property |
| Valor del encabezado personalizado | La clave de acceso del Paso 1 |
| Método | POST |
| Formato de entrada de registro JSON | Delimitado por saltos de línea. También funciona una matriz de JSON. |
| Compresión | Gzip (recomendado) o ninguna. No se aceptan Zstd ni Snappy. |
| Campos de TLS | Dejar en blanco |
En Opciones Advanced, establece Seleccionar un formato de línea de registro en En blanco. Haz clic en Crear y luego en Activar para activar la nueva versión. Fastly empieza a transmitir de inmediato.
warning
El formato de línea de registro debe ser En blanco. El valor predeterminado, Clásico, antepone un encabezado syslog a cada línea, y Ahrefs rechaza esos lotes.
info
Cuando guardas el punto de conexión, Fastly comprueba que el host de destino acepte registros desde servicios de Fastly. Ahrefs responde a esa comprobación para todos, así que no hay nada que configurar por tu parte.
Formato de registro
Fastly rellena los marcadores de posición %{...}V para cada solicitud. Tú decides qué compartir: el formato mínimo es suficiente para que Bot Analytics funcione, y el formato recomendado ofrece mejores resultados. Las claves desconocidas se ignoran, así que puedes mantener los campos adicionales que ya registras.
Mínimo. Visitas de bots con hora, página y nombre del 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"
}
Recomendado. Añade la IP del visitante para los datos de ubicación, el estado y los detalles de respuesta que se muestran con cada visita, la verificación de Web Bot Auth y el marcador de borde que elimina duplicados cuando tu servicio usa shielding:
{
"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"
}
Combina ambos como quieras: las cuatro claves mínimas son obligatorias; cualquier otra clave puede omitirse, dejarse vacía o como (null). Mantén fastly_is_edge siempre que tu servicio tenga un shield; de lo contrario, cada fallo se cuenta dos veces. Las claves sin comillas (timestamp, response_status, response_body_size, fastly_is_edge) siempre deben tener un valor; de lo contrario, la línea no es un JSON válido.
info
Los servicios Fastly Compute escriben el mismo JSON desde el código, un objeto por línea, con la configuración del punto de conexión del paso 2.
Paso 3 — Verificar
Fastly entrega los registros en lotes pequeños, normalmente en el minuto siguiente a las solicitudes. Las visitas de bots aparecen en el informe de Bot Analytics unos minutos después. También se envían solicitudes desde navegadores; Ahrefs descarta todo lo que no sea un bot.
Solución de problemas
Fastly no muestra errores de entrega para puntos de conexión HTTPS en el panel de control, así que comprueba la configuración con la tabla anterior cuando no llegue nada. Ahrefs responde a cada lote con una de estas opciones:
| Respuesta | Causa |
|---|---|
401 missing authentication header | El nombre del encabezado personalizado está mal escrito o está vacío. |
403 invalid authentication | El valor del encabezado personalizado no coincide con un proyecto de Ahrefs. Cópiala de nuevo del Paso 1. |
400 record 0: … | El formato de la línea de registro es Clásico en lugar de En blanco, la compresión no es Gzip ni está desactivada, o el formato de registro no es JSON válido. |
400 record N: Missing record field … | Delimitado por saltos de línea: al formato de registro le falta una de las claves obligatorias. |
400 invalid body: not a JSON array of log records: … | Array de JSON: el formato de la línea de registro es Clásico en lugar de En blanco, al formato de registro le falta una clave obligatoria o no es JSON válido. |
400 body is not valid gzip | La compresión es Gzip en Fastly, pero el cuerpo no se pudo descomprimir. |