Docs
搜索文档...⌘K

Fastly

Fastly 的实时日志流式传输功能可以通过 HTTPS 将您服务的请求日志发送到 Ahrefs。您可以在 Fastly 控制面板中为您的 Fastly 服务添加一个日志记录端点;Ahrefs 无需访问您的 Fastly 账号。

前提条件

  • 为您的 Ahrefs 项目域名提供服务的 Fastly CDN 服务。任何 Fastly 套餐都可以,包括免费套餐。
  • 拥有编辑该服务配置并激活新版本的权限。

第 1 步——获取访问密钥

  1. 在 Ahrefs 中,进入你项目的 项目设置 → Bot Analytics。
  2. 选择 Fastly。
  3. 复制 URL、自定义标头名称和自定义标头值。标头值就是你的访问密钥:它用于识别你的项目,因此请将其视为密码来保管。

你需要的其他内容都在此页面上。

第 2 步——添加日志记录端点

在 Fastly 控制面板中,打开你的服务,点击 编辑配置,并克隆当前激活的版本。在左侧菜单中选择 日志记录,然后选择 HTTPS 和 创建端点。

端点字段

字段值
名字Ahrefs Bot Analytics
位置格式版本默认值
日志格式使用下方的日志格式替换默认格式
URLhttps://analytics.ahrefs.com/api/fastly/logs
最大日志数、最大字节数留空
内容类型application/json
自定义标头名称X-Ahrefs-Web-Analytics-Property
自定义标头值第 1 步中的访问密钥
方法POST
JSON 日志条目格式以换行符分隔。也支持 JSON 数组。
压缩Gzip(推荐)或不压缩。不接受 Zstd 和 Snappy。
TLS 字段留空

在 高级选项 下,将 选择日志行格式 设置为 空白。点击 创建,然后点击 激活 来激活新版本。 Fastly 会立即开始传输。

warning

日志行格式必须为 空白。默认选项 经典 会在每一行前添加 syslog 标头,而 Ahrefs 会拒绝这些批次。

info

当你保存端点时,Fastly 会检查目标主机是否接受来自 Fastly 服务的日志。 Ahrefs 会为所有人响应该检查,因此你这边无需进行任何配置。

日志格式

Fastly 会为每个请求填充 %{...}V 占位符。你可以决定要分享哪些内容:最简格式足以让 Bot Analytics 正常运行;推荐格式可带来更好的效果。未知键会被忽略,因此你可以保留已记录的额外字段。

最简。 包含时间、页面和机器人名称的机器人访问:

{
  "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"
}

推荐。 添加用于位置数据的访客 IP、随每次访问显示的状态和响应详情、Web Bot Auth 验证,以及在你的服务使用屏蔽功能时用于去重的边缘标记:

{
  "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"
}

这两种方式可按需混用:这 4 个基本键是必需的,其他任何键都可以省略、留空或设为 (null)。只要你的服务启用了 shield,就要保留 fastly_is_edge;否则每次未命中都会被计算两次。这些不带引号的键(timestamp、response_status、response_body_size、fastly_is_edge)必须始终有值,否则该行不是有效的 JSON。

info

Fastly Compute 服务会在代码中写出相同的 JSON,每行一个对象,并使用第 2 步中的端点设置。

第 3 步——验证

Fastly 会以小批量的方式投递日志,通常在请求发生后 1 分钟内完成。这些机器人访问随后会在几分钟后显示在 Bot Analytics 报告中。来自浏览器的请求也会被发送;Ahrefs 会丢弃所有非机器人流量。

故障排除

Fastly 在控制面板中不会显示 HTTPS 端点的投递错误,因此当一直没有收到数据时,请对照上表检查设置。 Ahrefs 会对每个批次返回以下其中一种响应:

响应原因
401 missing authentication header自定义请求头名称拼写错误或为空。
403 invalid authentication自定义请求头的值与任何 Ahrefs 项目都不匹配。请从第 1 步重新复制一次。
400 record 0: …日志行格式为 经典 而不是 空白,压缩格式既不是 Gzip 也不是无,或者日志格式不是有效的 JSON。
400 record N: Missing record field …换行符分隔:日志格式缺少某个必需的键。
400 invalid body: not a JSON array of log records: …JSON 数组:日志行格式为 经典 而不是 空白,日志格式缺少必需的键,或者不是有效的 JSON。
400 body is not valid gzipFastly 中的压缩设置为 Gzip,但请求体无法解压缩。