Cloudflare 워커
Cloudflare Worker는 각 요청마다 스크립트를 실행하여 데이터를 Ahrefs로 전송합니다. 이 방법은 Free를 포함한 모든 Cloudflare 요금제에서 작동합니다. 브라우저에서 발생한 요청도 전송되지만, Ahrefs는 봇이 아닌 모든 항목을 폐기합니다.
각 요청마다 워커는 URL, 상태 코드, 콘텐츠 유형과 리디렉션의 경우 Location 응답 헤더를 전송하므로 봇 애널리틱스에서 리디렉션이 봇을 어디로 보냈는지 표시할 수 있습니다. Location이 추가되기 전에 배포된 워커는 다시 연결하거나 재배포할 때까지 기존 데이터를 계속 전송합니다.
사전 준비 사항
- 웹사이트 도메인이 영역으로 추가된 Cloudflare 계정.
- 다음 권한이 있는 Cloudflare API 토큰:
- 계정 → 워커 스크립트 → 편집
- 영역 → 워커 경로 → 편집
- 영역 → 영역 → 읽기
- 영역 → DNS → 읽기 (선택 사항, Ahrefs가 DNS 레코드가 프록시 처리되어 있는지 확인할 수 있게 함)
info
워커는 Cloudflare를 거치는 요청에 대해서만 실행됩니다. DNS 전용 (회색 구름)으로 설정된 DNS 레코드는 방문자를 원본 서버로 바로 보내므로, 봇 애널리틱스는 해당 레코드에 대한 데이터를 받지 못합니다. 도메인의 DNS 레코드가 프록시됨 (주황색 구름)으로 설정되어 있는지 확인하세요. 프록시 상태를 참고하세요.
Workers 요청 할당량
warning
워커는 사이트로 들어오는 모든 요청에서 실행되므로, 각 요청이 Cloudflare Workers 요청 할당량에 포함됩니다. 무료 플랜은 계정의 모든 워커가 공유하는 하루 100,000건의 요청을 제공합니다. 트래픽이 많은 사이트라면 금방 소진될 수 있습니다.
Ahrefs는 request_limit_fail_open을 true로 설정한 상태로 라우트를 생성합니다. 할당량이 소진되면 Cloudflare는 Worker를 실행하지 않고 평소처럼 사이트를 제공합니다. 할당량이 재설정될 때까지 봇 애널리틱스는 데이터를 받지 못합니다. 플랜별 할당량은 Workers 제한 사항을 참고하세요.
사이트 트래픽이 할당량을 초과한다면 Workers Paid로 업그레이드하거나 엔터프라이즈 플랜에서 Cloudflare Logpush를 사용하세요.
Cloudflare API 토큰 가져오기
올바른 계정으로 Cloudflare 대시보드에 로그인되어 있는지 확인하세요. 그런 다음 https://dash.cloudflare.com/profile/api-tokens 페이지로 이동해 오른쪽 상단의 토큰 만들기 버튼을 찾아 클릭하세요:
이제 사용자 지정 토큰 생성 흐름을 진행하세요:
다음 정보를 입력하세요:
- API 토큰 이름: ahrefs-bot-analytics
- 다음 권한을 부여하세요:
- 봇 방문을 추적하기 위한 워커 스크립트를 업로드할 수 있도록 Account / Workers Script / Edit
- 요청 시 워커 스크립트를 실행하도록 할당할 수 있도록 Zone / Workers Routes / Edit
- 구성할 영역을 찾을 수 있도록 Zone / Zone / Read
- DNS 레코드가 Cloudflare를 통해 프록시되는지 확인할 수 있도록 Zone / DNS / Read(선택 사항) 권한을 부여해 주세요.
- Account Resources는 Include / All Accounts로 설정할 수 있으며, 또는 웹사이트를 호스팅하는 계정으로 범위를 제한할 수도 있습니다.
- Zone Resources는 Include / All Zones로 설정할 수 있으며, 또는 웹사이트 도메인에 해당하는 영역을 선택할 수도 있습니다.
입력을 완료한 폼은 다음과 같이 표시됩니다:
이제 Continue to summary 버튼을 클릭하세요. 요약은 다음과 같이 표시됩니다:
이제 Create Token 버튼을 클릭하고, 생성된 토큰을 다음 단계에서 사용할 수 있도록 클립보드에 복사하세요.
추가 정보는 Cloudflare 문서의 API 토큰 생성 방법을 참고하세요.
자동 설정
- Ahrefs에서 프로젝트 설정 → 봇 애널리틱스로 이동합니다.
- 방법으로 Cloudflare Worker를 선택합니다.
- Cloudflare API 토큰을 붙여넣고 Connect를 클릭합니다.
Ahrefs는 토큰을 사용하여 다음 작업을 수행합니다:
- 프로젝트의 도메인과 일치하는 Zone을 찾습니다.
- DNS 레코드가 Cloudflare를 통해 프록시되는지 확인하고, 그렇지 않은 경우 경고합니다(선택 사항인 Zone → DNS → Read 권한 필요).
- Ahrefs 애널리틱스 워커 배포.
- 모든 요청에서 실행될 경로를 설정하세요.
info
토큰은 한 번만 사용되며 저장되지 않습니다.
수동 설정
API 토큰을 제공하지 않으려면 Cloudflare API를 사용해 워커를 수동으로 배포할 수 있습니다.
1단계 — Account ID, Zone ID 및 API 토큰 가져오기
-
Cloudflare 대시보드로 이동하여 웹사이트의 도메인을 선택합니다.
-
대시보드에서
$ACCOUNT_ID및$ZONE_ID를 찾습니다. -
"API 토큰 받기"를 클릭한 다음, 다음 권한으로 새 토큰을 생성합니다.
- 계정 → 워커 스크립트 → 편집
- 영역 → 워커 경로 → 편집
- 영역 → 영역 → 읽기
자세한 안내는 API 토큰 얻기를 참고하세요.
2단계 — 워커 배포
프로젝트 세부 정보가 미리 입력된 정확한 명령어는 프로젝트 설정 → 봇 애널리틱스 → 수동으로 설정에서 확인할 수 있습니다.
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와 경로 패턴은 프로젝트마다 고유합니다. 올바른 값이 적용되도록 프로젝트 설정 → 봇 애널리틱스 페이지에서 정확한 명령어를 복사하세요.
3단계 — 연결 확인
워커를 배포하고 경로를 만든 다음 Ahrefs에서 프로젝트 설정 → 봇 애널리틱스로 돌아가 상태 확인을 클릭하여 데이터가 수신되는지 확인하세요. 데이터가 들어오지 않으면 DNS 레코드가 프록시되어 있는지 확인하세요.