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 令牌。
自动设置
- 在 Ahrefs 中,前往项目设置 → Bot Analytics。
- 选择 Cloudflare Worker 作为方法。
- 粘贴您的 Cloudflare API 令牌,然后点击 连接。
Ahrefs 将使用您的令牌来:
- 查找与您项目域名匹配的 zone。
- 检查你的 DNS 记录是否通过 Cloudflare 代理,并在未代理时向你发出警告(需要可选的 区域 → DNS → 读取 权限)。
- 部署 Ahrefs analytics worker.
- 设置一个路由,使其在所有请求上运行.
info
您的令牌仅使用一次,不会被存储。
手动设置
如果您不想提供 API 令牌,可以使用 Cloudflare API 手动部署该 Worker。
步骤 1 — 获取您的账户 ID、区域 ID 和 API 令牌
-
前往您的 Cloudflare Dashboard,并选择您网站的域名。
-
在 Dashboard 中找到您的
$ACCOUNT_ID和$ZONE_ID。 -
点击“获取您的 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 记录是否已通过代理。