Cloudflare (BYOCDN)
この設定により、エージェント型トラフィック(AI ボットおよびLLM ユーザーエージェントからのリクエスト)がEdge Optimize バックエンドサービス(live.edgeoptimize.net)にルーティングされます。 通常どおり、人間の訪問者とSEO ボットは、元のページから引き続き提供されます。 設定をテストするには、設定が完了した後、応答でヘッダーx-edgeoptimize-request-idを探します。
前提条件
Cloudflare Workerのルーティングルールを設定する前に、次のことを確認してください。
- ドメインでWorkersが有効になっているCloudflare アカウント。
- CloudflareでドメインのDNS設定にアクセスします。
- LLM Optimizer UIから取得したEdge Optimize API キー。 手順については、API キーの取得を参照してください。
- (オプション)ステージング ルーティングをテストするには、 ステージング API キーを参照してください。
ルーティングの仕組み
正しく設定されると、エージェンティックユーザーエージェントからのドメインへのリクエスト(例えばwww.example.com/page.html)がCloudflare Workerによって傍受され、Edge Optimize バックエンドにルーティングされます。 バックエンドリクエストには、必要なヘッダーが含まれています。
バックエンドリクエストのテスト
Edge Optimize バックエンドに直接リクエストすることで、ルーティングを検証できます。
curl -svo /dev/null https://live.edgeoptimize.net/page.html \
-H 'x-forwarded-host: www.example.com' \
-H 'x-edgeoptimize-url: /page.html' \
-H 'x-edgeoptimize-api-key: $EDGE_OPTIMIZE_API_KEY' \
-H 'x-edgeoptimize-config: LLMCLIENT=TRUE;'
必須ヘッダー
Edge Optimize バックエンドへのリクエストには、次のヘッダーを設定する必要があります。
x-forwarded-hostwww.example.comx-edgeoptimize-url/page.html または /products?id=123x-edgeoptimize-api-keyyour-api-key-herex-edgeoptimize-configLLMCLIENT=TRUE;設定オプション
Edge Optimize用にCloudflare Workerを設定するには、次の2つの方法があります。
- オプション 1: Cloudflareへのデプロイ (推奨) – 新しいワーカーを自動的に作成し、必要な環境変数とシークレットの入力を求めるメッセージを表示します。 このドメインに既存のCloudflare Workerがない場合は、このオプションを使用します。
- オプション 2:手動セットアップ — ワーカーを自分で作成および設定するための手順ごとの手順。 ドメインに既存のCloudflare Workerが既に設定されている場合は、このオプションを使用します。Edge Optimize コードを既存のワーカーにマージする必要があります( ステップ 2: ワーカーコードを追加を参照)。また、デプロイメントを完全に制御する必要がある場合は、このオプションを使用します。
選択したオプションに関係なく、ワーカーをドメインに手動でリンクする必要があります。手順:ドメインへのルートの追加を参照してください。
オプション 1:Cloudflareへのデプロイ
このオプションでは、「Cloudflareにデプロイ」ボタンを使用して、ワーカーを自動的に作成し、Cloudflare アカウントに必要な環境変数とシークレットを設定します。 これは、新しいワーカーを設定する場合に最も簡単に開始できる方法です。
手順1: ワーカーのデプロイ
以下のボタンをクリックして、Edge Optimize ワーカーをCloudflare アカウントにデプロイします。
手順2:展開フォームに入力
ボタンをクリックすると、ワーカーの設定ページが開きます。 次のようにフォームに入力します。
-
Git アカウント — ドロップダウンからGitHubまたはGitLab アカウントを選択します。 Cloudflareは、ワーカーコードをアカウントのリポジトリにフォークします。 アカウントがリストにない場合は、+新規GitHub Connectionまたは +新規GitLab Connection を選択して、ドロップダウンから直接新しい接続を追加できます。 詳しくは、Cloudflare Git統合ガイド を参照してください。
新しいGitHub接続と新しいGitLab接続オプションを表示する
-
プライベート Git リポジトリを作成 – このチェックをオンのままにします(デフォルト)。
-
プロジェクト名 —
edge-optimize-routerのままにするか、任意の名前を入力してください。 -
EDGE_OPTIMIZE_API_KEY — Adobeが提供するEdge Optimize API キーを貼り付けます。 この値は、暗号化された秘密鍵として保存されます。
-
EDGE_OPTIMIZE_TARGET_HOST — プロトコルなしでサイトのドメインを入力します(例:
www.example.com)。 -
ビルド コマンド – 空のままにします。
-
デプロイ コマンド —
npm run deployのままにします(事前入力)。 -
実稼動以外のブランチ用のビルド – 選択を解除します。 これは開発者ワークフロー機能であり、このデプロイメントには必要ありません。
-
「作成してデプロイ」をクリックします。
ワーカーをデプロイしたら、 ドメインへのルートの追加に進み、ワーカーをドメインにリンクします。 ルーティングは自動的に設定されないので、手動で完了する必要があります。
オプション 2:手動セットアップ
ワーカーを手動で作成および設定するには、次の手順に従います。
手順1: Cloudflare Workerの作成
- Cloudflare ダッシュボードにログインします。
- サイドバーの Workers & Pages に移動します。
- 「アプリケーションを作成」をクリックし、ワーカーを作成をクリックします。
- ワーカーに名前を付けます(例:
edge-optimize-router)。 - 「デプロイ」をクリックして、デフォルトコードを使用してワーカーを作成します。
手順2: ワーカーコードを追加
ワーカーを作成したら、コードを編集をクリックし、デフォルトコードを次のコードに置き換えます。 既存のCloudflare Workerがある場合は、以下のコードを完全に置き換えるのではなく、既存のワーカーコードとマージします。
/**
* Edge Optimize BYOCDN - Cloudflare Worker
*
* This worker routes requests from agentic bots (AI/LLM user agents) to the
* Edge Optimize backend service for optimized content delivery.
*
* Features:
* - Routes agentic bot traffic to Edge Optimize backend
* - Failover to origin on Edge Optimize errors (any 4XX or 5XX errors)
* - Loop protection to prevent infinite redirects
* - Human visitors and SEO bots are served from the origin as usual
*/
// List of agentic bot user agents to route to Edge Optimize
const AGENTIC_BOTS = [
'AdobeEdgeOptimize-AI',
'ChatGPT-User',
'GPTBot',
'OAI-SearchBot',
'PerplexityBot',
'Perplexity-User'
];
// Targeted paths for Edge Optimize routing
// Set to null to route all HTML pages, or specify an array of paths
const TARGETED_PATHS = null; // e.g., ['/', '/page.html', '/products']
// Failover configuration
// Failover on any 4XX client error or 5XX server error from Edge Optimize
const FAILOVER_ON_4XX = true; // Failover on any 4XX error (400-499)
const FAILOVER_ON_5XX = true; // Failover on any 5XX error (500-599)
export default {
async fetch(request, env, ctx) {
return await handleRequest(request, env, ctx);
},
};
async function handleRequest(request, env, ctx) {
const url = new URL(request.url);
const userAgent = request.headers.get("user-agent")?.toLowerCase() || "";
// Check if request is already processed (loop protection)
const isEdgeOptimizeRequest = !!request.headers.get("x-edgeoptimize-request");
// Construct the original path and query string
const pathAndQuery = `${url.pathname}${url.search}`;
// Check if the path matches HTML pages (no extension or .html extension)
const isHtmlPage = /(?:\/[^./]+|\.html|\/)$/.test(url.pathname);
// Check if path is in targeted paths (if specified)
const isTargetedPath = TARGETED_PATHS === null
? isHtmlPage
: (isHtmlPage && TARGETED_PATHS.includes(url.pathname));
// Check if user agent is an agentic bot
const isAgenticBot = AGENTIC_BOTS.some((ua) => userAgent.includes(ua.toLowerCase()));
// Route to Edge Optimize if:
// 1. Request is NOT already from Edge Optimize (prevents infinite loops)
// 2. User agent matches one of the agentic bots
// 3. Path is targeted for optimization
if (!isEdgeOptimizeRequest && isAgenticBot && isTargetedPath) {
// Build the Edge Optimize request URL
const edgeOptimizeURL = `https://live.edgeoptimize.net${pathAndQuery}`;
// Clone and modify headers for the Edge Optimize request
const edgeOptimizeHeaders = new Headers(request.headers);
// Remove any existing Edge Optimize headers for security
edgeOptimizeHeaders.delete("x-edgeoptimize-api-key");
edgeOptimizeHeaders.delete("x-edgeoptimize-url");
edgeOptimizeHeaders.delete("x-edgeoptimize-config");
edgeOptimizeHeaders.delete("x-edgeoptimize-fetcher-key"); // Optional (required only in case of WAF)
// x-forwarded-host: The original site domain
// Use environment variable if set, otherwise use the request host
edgeOptimizeHeaders.set("x-forwarded-host", env.EDGE_OPTIMIZE_TARGET_HOST ?? url.host);
// x-edgeoptimize-api-key: Your Adobe-provided API key
edgeOptimizeHeaders.set("x-edgeoptimize-api-key", env.EDGE_OPTIMIZE_API_KEY);
// x-edgeoptimize-url: The original request URL path and query
edgeOptimizeHeaders.set("x-edgeoptimize-url", pathAndQuery);
// x-edgeoptimize-config: Configuration for cache key differentiation
edgeOptimizeHeaders.set("x-edgeoptimize-config", "LLMCLIENT=TRUE;");
// edgeOptimizeHeaders.set("x-edgeoptimize-fetcher-key", "<YOUR FETCHER KEY>"); // Optional (required only in case of WAF)
try {
// Send request to Edge Optimize backend
const edgeOptimizeResponse = await fetch(new Request(edgeOptimizeURL, {
headers: edgeOptimizeHeaders,
redirect: "manual", // Preserve redirect responses from Edge Optimize
}), {
cf: {
cacheEverything: true, // Enable caching based on origin's cache-control headers
},
});
// Check if we need to failover to origin
const status = edgeOptimizeResponse.status;
const is4xxError = FAILOVER_ON_4XX && status >= 400 && status < 500;
const is5xxError = FAILOVER_ON_5XX && status >= 500 && status < 600;
if (is4xxError || is5xxError) {
console.log(`Edge Optimize returned ${status}, failing over to origin`);
return await failoverToOrigin(request, env, url);
}
// Return the Edge Optimize response
return edgeOptimizeResponse;
} catch (error) {
// Network error or timeout - failover to origin
console.log(`Edge Optimize request failed: ${error.message}, failing over to origin`);
return await failoverToOrigin(request, env, url);
}
}
// For all other requests (human users, SEO bots), pass through unchanged
return fetch(request);
}
/**
* Failover to origin server when Edge Optimize returns an error
* @param {Request} request - The original request
* @param {Object} env - Environment variables
* @param {URL} url - Parsed URL object
*/
async function failoverToOrigin(request, env, url) {
// Build origin URL
const originURL = `${url.protocol}//${env.EDGE_OPTIMIZE_TARGET_HOST}${url.pathname}${url.search}`;
// Prepare headers - clean Edge Optimize headers and add loop protection
const originHeaders = new Headers(request.headers);
originHeaders.set("Host", env.EDGE_OPTIMIZE_TARGET_HOST);
originHeaders.delete("x-edgeoptimize-api-key");
originHeaders.delete("x-edgeoptimize-url");
originHeaders.delete("x-edgeoptimize-config");
originHeaders.delete("x-forwarded-host");
originHeaders.set("x-edgeoptimize-request", "fo");
// Create and send origin request
const originRequest = new Request(originURL, {
method: request.method,
headers: originHeaders,
body: request.body,
redirect: "manual",
});
const originResponse = await fetch(originRequest);
// Add failover marker header to response
const modifiedResponse = new Response(originResponse.body, {
status: originResponse.status,
statusText: originResponse.statusText,
headers: originResponse.headers,
});
modifiedResponse.headers.set("x-edgeoptimize-fo", "1");
return modifiedResponse;
}
「保存してデプロイ」をクリックして、ワーカーを公開します。
手順3:環境変数とシークレットの設定
環境変数は、API キーなどの機密性の高い設定を安全に保存できます。
-
作業者の設定で、設定 > 変数に移動します。
-
環境変数で、変数を追加をクリックします。
-
次の変数を追加します。
table 0-row-3 1-row-3 2-row-3 変数名 説明 必須 EDGE_OPTIMIZE_API_KEYAdobeが提供するEdge Optimize API キー。 はい EDGE_OPTIMIZE_TARGET_HOSTEdge Optimize リクエストのターゲットホスト( x-forwarded-hostヘッダーとして送信)とフェールオーバー用のオリジンドメイン。 プロトコルを使用しないドメインのみである必要があります(例:www.example.com、https://www.example.comではありません)。はい -
API キーの場合は、暗号化をクリックして安全に保存します。
-
「保存してデプロイ」をクリックします。
ドメインへのルートの追加 add-a-route-to-your-domain
使用した設定オプションに関係なく、ワーカーをドメインに手動でリンクする必要があります。 このステップは、トラフィック上のワーカーをアクティブにします。
- 作業者のトリガー > 設定に移動します。
- ルートで、ルートを追加をクリックします。
- ドメインパターン(
www.example.com/*やexample.com/*など)を入力します。 - ドロップダウンからゾーンを選択します。
- 「保存」をクリックします。
または、ゾーンレベルでルートを設定することもできます。
- Cloudflareでドメインに移動します。
- Workers Routesに移動します。
- 「ルートを追加」をクリックし、パターンとワーカーを指定します。
フェールオーバー動作の検証
Edge Optimizeが使用できない場合、またはエラーが返された場合、ワーカーは自動的にオリジンにフェールオーバーします。 フェールオーバー応答には、x-edgeoptimize-fo ヘッダーが含まれます。
< HTTP/2 200
< x-edgeoptimize-fo: 1
Cloudflare Workers ログでフェイルオーバーイベントを監視して、問題をトラブルシューティングできます。
ワーカーロジックについて
Cloudflare Workerは、次のロジックを実装します。
-
ユーザーエージェント検出:受信リクエストのユーザーエージェントが、定義されたエージェント型ボットのいずれかと一致するかどうかを確認します(大文字と小文字を区別しません)。
-
パスのターゲット:必要に応じて、ターゲット設定されたパスに基づいてリクエストをフィルタリングします。 デフォルトでは、すべてのHTML ページ(末尾が
/、拡張子なし、または.html)がルーティングされます。TARGETED_PATHS配列を使用して特定のパスを指定できます。 -
ループ保護:
x-edgeoptimize-requestヘッダーは、無限ループを防ぎます。 Edge Optimizeがオリジンにリクエストを返すと、このヘッダーは"1"に設定され、ワーカーはEdge Optimizeにルーティングせずにリクエストを渡します。 -
ヘッダーのセキュリティ: Edge Optimize ヘッダーを設定する前に、ワーカーは既存の
x-edgeoptimize-*ヘッダーを受信リクエストから削除して、ヘッダーインジェクション攻撃を防ぎます。 -
ヘッダーマッピング: ワーカーは、Edge Optimizeに必要なヘッダーを設定します。
x-forwarded-host– 元のサイト ドメインを識別します。x-edgeoptimize-url– 元のリクエストパスとクエリ文字列を保持します。x-edgeoptimize-api-key- Edge Optimizeでリクエストを認証します。x-edgeoptimize-config- キャッシュ キー設定を提供します。
-
フェールオーバーロジック: Edge Optimizeがエラーステータスコード(4XX クライアントエラーまたは5XX サーバーエラー)を返すか、ネットワークエラーが原因でリクエストが失敗した場合、ワーカーは
EDGE_OPTIMIZE_TARGET_HOSTを使用してオリジンに自動的にフェールオーバーします。 フェールオーバー応答には、フェールオーバーが発生したことを示すx-edgeoptimize-fo: 1ヘッダーが含まれています。 -
リダイレクト処理:
redirect: "manual"オプションを使用すると、Edge Optimizeからのリダイレクト応答が、ワーカーが追いかけることなくクライアントに確実に渡されます。
設定のカスタマイズ
コードの上部にある設定定数を変更することで、ワーカーの動作をカスタマイズできます。
エージェント型ボットリスト
AGENTIC_BOTS配列を変更して、ユーザーエージェントを追加または削除します:
const AGENTIC_BOTS = [
'AdobeEdgeOptimize-AI',
'ChatGPT-User',
'GPTBot',
'OAI-SearchBot',
'PerplexityBot',
'Perplexity-User',
// Add additional user agents as needed
'ClaudeBot',
'Anthropic-AI'
];
対象パス
デフォルトでは、すべてのHTML ページがEdge Optimizeにルーティングされます。 ルーティングを特定のパスに制限するには、TARGETED_PATHS配列を変更します。
// Route all HTML pages (default)
const TARGETED_PATHS = null;
// Or specify exact paths to route
const TARGETED_PATHS = ['/', '/page.html', '/products', '/about-us'];
フェールオーバー設定
デフォルトでは、ワーカーはEdge Optimizeの4XXまたは5XX エラーでフェールオーバーします。 この動作をカスタマイズ:
// Default: failover on any 4XX or 5XX error
const FAILOVER_ON_4XX = true;
const FAILOVER_ON_5XX = true;
// Failover only on 5XX server errors (not 4XX client errors)
const FAILOVER_ON_4XX = false;
const FAILOVER_ON_5XX = true;
// Disable automatic failover (not recommended)
const FAILOVER_ON_4XX = false;
const FAILOVER_ON_5XX = false;
重要な検討事項
-
フェールオーバー動作: Edge Optimizeからエラー(4XXまたは5XX ステータスコード)が返された場合、またはネットワークエラーが原因でリクエストが失敗した場合、ワーカーは自動的にオリジンにフェールオーバーします。 フェールオーバーは、オリジン ドメインとして
EDGE_OPTIMIZE_TARGET_HOSTを使用します(FastlyのF_Default_OriginまたはCloudFrontのDefault_Originと同様)。 フェールオーバー応答には、x-edgeoptimize-fo: 1ヘッダーが含まれており、監視とデバッグに使用できます。 -
キャッシュ: Cloudflareは、デフォルトでURLに基づいて応答をキャッシュします。 エージェント型トラフィックは人間のトラフィックとは異なるコンテンツを受信するため、キャッシュ設定でこれが考慮されていることを確認してください。 キャッシュされたコンテンツを区別するために、キャッシュ APIまたはキャッシュ ヘッダーの使用を検討してください。
x-edgeoptimize-configヘッダーはキャッシュキーに含める必要があります。 -
レート制限: Edge Optimizeの使用状況を監視し、必要に応じてエージェント型トラフィックのレート制限を導入することを検討します。
-
テスト:実稼動にデプロイする前に、必ずステージング環境で設定をテストしてください。 エージェント型トラフィックと人間のトラフィックの両方が期待どおりに動作することを確認します。 Edge Optimize エラーをシミュレートして、フェールオーバーの動作をテストします。
-
ログ: Cloudflare Workerのログを有効にして、リクエストを監視し、問題をトラブルシューティングします。 Workers > your worker > Logsに移動して、リアルタイム ログを表示します。 ワーカーは、デバッグ目的でフェールオーバーイベントをログに記録します。
トラブルシューティング
x-edgeoptimize-request-id ヘッダーがありませんAGENTIC_BOTS配列にあることを確認してください。EDGE_OPTIMIZE_API_KEYが環境変数とシークレットで正しく設定されていることを確認します。 API キーがアクティブであることを確認するには、Adobeにお問い合わせください。x-edgeoptimize-request ヘッダーのチェックが適切に行われていることを確認します。TARGETED_PATHSが正しく設定されていることを確認してください。x-edgeoptimize-fo: 1 ヘッダーFAILOVER_ON_4XXとFAILOVER_ON_5XXがtrueに設定されていることを確認します。 ワーカーのログでエラーメッセージを確認します。TARGETED_PATHS (指定されている場合)で、HTML ページの正規表現パターンと一致することを確認します。EDGE_OPTIMIZE_TARGET_HOSTにはプロトコルが含まれています(例:https://)。https://example.comではなくexample.com)。ファイアウォール ルールを使用してEdgeで最適化を許可する(オプション)
CDNでWAFまたはBot Managerを使用している場合:
-
WAFまたはBot Managerで
*AdobeEdgeOptimize/1.0*ユーザーエージェントを許可リストに加えるして、Optimize at Edge サービスがオリジンコンテンツを取得できるようにします。 -
ファイアウォールでユーザーエージェント以外の追加の検証が必要な場合は、秘密鍵(例:
openssl rand -hex 32)を生成し、次の操作を行います。- ルーティングルールのシークレットを他の
x-edgeoptimize-*ヘッダーと共にx-edgeoptimize-fetcher-keyを追加します。 - WAFまたはBot Manager ルールを追加して、
x-edgeoptimize-fetcher-keyが同じシークレットと一致するリクエストを許可します。
- ルーティングルールのシークレットを他の
-
Edgeで最適化すれば、このヘッダーをそのまま転送できます。ユーザーは鍵のライフサイクル全体を所有しています。
設定を確認
設定が完了したら、ボットトラフィックがEdge Optimizeにルーティングされ、人間のトラフィックが影響を受けないことを確認します。
1. ボットトラフィックのテスト (最適化する必要があります)
エージェント型ユーザーエージェントを使用してAI ボットリクエストをシミュレートします。
curl -svo /dev/null https://www.example.com/page.html \
--header "user-agent: chatgpt-user"
応答が成功すると、x-edgeoptimize-request-id ヘッダーが含まれ、リクエストがEdge Optimizeを通じてルーティングされたことが確認されます。
< HTTP/2 200
< x-edgeoptimize-request-id: 50fce12d-0519-4fc6-af78-d928785c1b85
2. 人間のトラフィックをテストします(影響を受けません)
通常のヒューマンブラウザーリクエストをシミュレートします。
curl -svo /dev/null https://www.example.com/page.html \
--header "user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
応答には、notにx-edgeoptimize-request-id ヘッダーを含める必要があります。 Edgeで最適化を有効にする前に、ページの内容と応答時間を同じにしておく必要があります。
3. 2つのシナリオを区別する方法
x-edgeoptimize-request-idx-edgeoptimize-fo1)トラフィックルーティングのステータスは、LLM Optimizer UIでも確認できます。 顧客設定に移動し、CDN設定 タブを選択します。
利用可能なオポチュニティ、自動最適化ワークフロー、FAQなど、Edgeでの最適化について詳しくは、Edgeでの最適化の概要に戻ります。