Docs
搜索文档...⌘K

Cloudflare worker

Cloudflare Worker 会在每次请求时运行脚本,并将数据发送到 Ahrefs。此方法适用于任何 Cloudflare 套餐,包括免费版。来自浏览器的请求也会被发送;Ahrefs 会丢弃所有非机器人流量。

对于每个请求,worker 会发送 URL、状态码、内容类型,以及在重定向时发送 Location 响应标头,以便 Bot Analytics 能显示重定向把机器人带到了哪里。在添加 Location 之前部署的 worker 会一直发送旧数据,直到你再次连接或重新部署它。

前提条件

  • 一个 Cloudflare 账户,并已将您网站的域名添加为一个区域。
  • 一个具有以下权限的 Cloudflare API 令牌:
    • 账户 → Worker 脚本 → 编辑
    • 区域 → Worker 路由 → 编辑
    • 区域 → 区域 → 读取
    • 区域 → DNS → 读取(可选,用于让 Ahrefs 验证你的 DNS 记录是否已启用代理)

info

该 Worker 只会在通过 Cloudflare 的请求上运行。设置为 仅限 DNS(灰色云朵)的 DNS 记录会将访问者直接引导至你的源站,因此 Bot Analytics 不会收到它们的任何数据。请确保你的域名记录已设为 已代理(橙色云朵),参阅代理状态。

Workers 请求配额

warning

Worker 会针对你网站的每个请求运行,因此每个请求都会计入你的 Cloudflare Workers 请求配额。免费套餐每天允许 100,000 次请求,由该账户下的所有 Worker 共享。高流量的网站可能很快就会用完。

Ahrefs 创建路由时会将 request_limit_fail_open 设为 true。当配额用尽时,Cloudflare 会跳过该 Worker,并照常为你的网站提供服务。在配额重置前,Bot Analytics 不会接收到任何数据。有关各套餐的配额,请参阅 Workers 限制。

如果你的网站流量超过配额允许的上限,请升级到 Workers 付费版,或在企业版套餐中使用 Cloudflare Logpush。

获取 Cloudflare API 令牌

请确保您已使用正确的账户登录 Cloudflare Dashboard。然后前往 https://dash.cloudflare.com/profile/api-tokens 页面,找到并点击右上角的 Create Token 按钮:

创建令牌

现在继续进行 创建自定义令牌 流程:

创建自定义令牌

填写以下信息:

  • API 令牌名称:ahrefs-bot-analytics
  • 授予以下权限:
    • 账户 / Workers 脚本 / 编辑,以便我们上传用于跟踪机器人访问的 Worker 脚本
    • 区域 / Workers 路由 / 编辑,以便我们将 Worker 脚本分配到请求上运行
    • 区域 / 区域 / 读取,以便我们找到要配置的区域
    • (可选)区域 / DNS / 读取 权限,以便我们验证你的 DNS 记录是否通过 Cloudflare 代理
  • 账户资源可以设置为 包含 / 所有账户;或者将范围限定为托管该网站的那个账户。
  • 区域资源可以设置为 包含 / 所有区域;或者选择与你的网站域名对应的区域。

填写完成的表单应如下所示:

令牌配置

现在点击 继续到摘要 按钮,摘要应如下所示:

令牌摘要

现在点击 创建令牌 按钮,并将生成的令牌复制到剪贴板,以便在接下来的步骤中使用。

更多信息请参阅 Cloudflare 文档:如何创建 API 令牌。

自动设置

  1. 在 Ahrefs 中,前往项目设置 → Bot Analytics。
  2. 选择 Cloudflare Worker 作为方法。
  3. 粘贴您的 Cloudflare API 令牌,然后点击 连接。

Ahrefs 将使用您的令牌来:

  1. 查找与您项目域名匹配的 zone。
  2. 检查你的 DNS 记录是否通过 Cloudflare 代理,并在未代理时向你发出警告(需要可选的 区域 → DNS → 读取 权限)。
  3. 部署 Ahrefs analytics worker.
  4. 设置一个路由,使其在所有请求上运行.

info

您的令牌仅使用一次,不会被存储。

手动设置

如果您不想提供 API 令牌,可以使用 Cloudflare API 手动部署该 Worker。

步骤 1 — 获取您的账户 ID、区域 ID 和 API 令牌

  1. 前往您的 Cloudflare Dashboard,并选择您网站的域名。

  2. 在 Dashboard 中找到您的 $ACCOUNT_ID 和 $ZONE_ID。

  3. 点击“获取您的 API 令牌”,并使用以下权限创建一个新令牌:

    • 账户 → Worker 脚本 → 编辑
    • 区域 → Worker 路由 → 编辑
    • 区域 → 区域 → 读取

    详细说明请参阅获取 API 令牌。

步骤 2 — 部署 Worker

您可以在 项目设置 → Bot Analytics → 手动设置 中找到已按您项目详情预填的准确命令。

Upload the Worker script

curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/scripts/ahrefs--bot-analytics--YOUR_SCRIPT_ID" \
  -X PUT \
  -H "Authorization: Bearer $CF_TOKEN" \
  -H "Content-Type: application/javascript" \
  --data-binary '
const WA_ENDPOINT = "https://analytics.ahrefs.com/api/cf_worker";
const WA_SCRIPT = "https://analytics.ahrefs.com/analytics.js";
const WA_CF_DATA_KEY = "YOUR_DATA_KEY";
const WA_DATA_KEY = "";
async function handleBotAnalytics(event, response) {
  let request = event.request;
  event.waitUntil(sendAnalytics(request, response));
  return response;
}

async function sendAnalytics(request, response) {
  try {
    let referer = request.headers.get("referer") || "";
    let userAgent = request.headers.get("user-agent") || "";
    let ip = request.headers.get("cf-connecting-ip") || "";
    let contentType = response.headers.get("content-type") || "";
    let payload = {
      n: "serverpageview",
      u: request.url,
      ip: ip,
      ua: userAgent,
      ct: contentType,
      m: request.method,
      s: response.status,
      k: WA_CF_DATA_KEY,
      r: referer,
    }
    let hs = {};
    for (let name of ["signature", "signature-input", "signature-agent"]) {
      let value = request.headers.get(name);
      if (value) hs[name] = value;
    }
    if (Object.keys(hs).length > 0) payload.hs = hs;
    let rhs = {};
    for (let name of ["location"]) {
      let value = response.headers.get(name);
      if (value) rhs[name] = value;
    }
    if (Object.keys(rhs).length > 0) payload.rhs = rhs;
    let analyticsResponse = await fetch(WA_ENDPOINT, {
      method: "POST",
      body: JSON.stringify(payload)
    })
    if (!analyticsResponse.ok) {
      console.error("ahrefs bot analytics error:", analyticsResponse.status, analyticsResponse.statusText)
    }
  } catch (error) {
    console.error("ahrefs bot analytics error:", error.message)
  }
}
addEventListener("fetch", event => {
  event.respondWith((async () => {
    let response = await fetch(event.request);
    response = await handleBotAnalytics(event, response);
    return response;
  })());
});
'

Create the route

curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes" \
  -X POST \
  -H "Authorization: Bearer $CF_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary '{"pattern":"*youwebsite.com/*","script":"ahrefs--bot-analytics--YOUR_SCRIPT_ID","request_limit_fail_open":true}'

将 yourwebsite.com 替换为您的域名。

warning

WA_CF_DATA_KEY 和路由模式对您的项目而言是唯一的。请从您的 项目设置 → Bot Analytics 页面复制准确的命令,以确保值正确。

第 3 步 — 验证连接

部署 Worker 并创建路由后,返回 Ahrefs 的 项目设置 → Bot Analytics,然后点击 检查状态,以验证是否正在接收数据。如果没有数据传入,请检查你的 DNS 记录是否已通过代理。