Docs
ドキュメントを検索...⌘K

Fastly

Fastly のリアルタイムログストリーミングを使うと、サービスのリクエストログを HTTPS 経由で Ahrefs に送信できます。 Fastly のコントロールパネルから Fastly サービスにロギングエンドポイントを追加します。Ahrefs が Fastly アカウントにアクセスする必要はありません。

前提条件

  • Ahrefs のプロジェクトのドメインを配信している Fastly CDN サービス。無料プランを含め、どの Fastly プランでも利用できます。
  • そのサービスの設定を編集し、新しいバージョンを有効化する権限。

ステップ 1 — アクセスキーを取得する

  1. Ahrefs で、対象プロジェクトの プロジェクト設定 → ボット解析 を開きます。
  2. Fastly を選択します。
  3. URL、カスタムヘッダー名、カスタムヘッダー値をコピーします。ヘッダー値はアクセスキーです。プロジェクトを識別するため、パスワードと同様に扱ってください。

ほかに必要なものは、このページにすべてあります。

ステップ 2 — ロギングエンドポイントを追加する

Fastly のコントロールパネルでサービスを開き、設定を編集 をクリックして、アクティブなバージョンをクローンします。左メニューで ロギング を選択し、次に HTTPS、エンドポイントを作成 の順に選択します。

エンドポイントのフィールド

フィールド値
名前Ahrefs ボット解析
配置フォーマットバージョンのデフォルト
ログ形式下の ログ形式(デフォルトの形式を置き換え)
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 プレースホルダーを埋めます。共有する内容はお客様が決められます。最小形式でもボット解析は動作しますが、推奨形式のほうがより良い結果が得られます。不明なキーは無視されるため、すでにログ出力している追加フィールドはそのまま残せます。

最小。 時刻、ページ、ボット名を含むボット訪問:

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

2 つを好きなように組み合わせてください。最小の 4 つのキーは必須で、それ以外のキーは省略するか、空欄、または (null) のままにできます。サービスにシールドがある場合は、fastly_is_edge を必ず残してください。そうしないと、各ミスが 2 回カウントされます。引用符なしのキー(timestamp、response_status、response_body_size、fastly_is_edge)には常に値が必要です。値がない場合、その行は有効なJSONではありません。

info

Fastly Computeサービスは、ステップ2のエンドポイント設定を使って、コードから同じJSONを(1行につき1オブジェクトとして)書き出します。

ステップ3 — 検証

Fastlyはログを小さなバッチで配信し、通常はリクエストから1分以内に届きます。その後、数分してボット解析レポートにボットの訪問が表示されます。ブラウザからのリクエストも送信されますが、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に設定されていますが、ボディを展開できませんでした。