Cloudflare (BYOCDN)
Cette configuration achemine le trafic dynamique (requêtes provenant de robots d’IA et d’agents utilisateurs LLM) vers le service principal Edge Optimize (live.edgeoptimize.net). Les visiteurs humains et les robots d’optimisation du moteur de recherche continuent d’être servis depuis votre origine comme d’habitude. Pour tester la configuration, une fois la configuration terminée, recherchez l’en-tête x-edgeoptimize-request-id dans la réponse.
Conditions préalables
Avant de configurer les règles de routage de CloudFlare Worker, vérifiez que vous disposez des éléments suivants :
- Un compte Cloudflare avec Workers activé sur votre domaine.
- Accès aux paramètres DNS de votre domaine dans Cloudflare.
- Clé d’API Edge Optimize récupérée à partir de l’interface utilisateur de LLM Optimizer. Pour connaître les étapes, voir Récupération de vos clés API.
- (Facultatif) Pour tester le routage d’évaluation, consultez Clé API d’évaluation.
Fonctionnement du routage
Lorsque la configuration est correcte, une requête vers votre domaine (par exemple, www.example.com/page.html) provenant d’un agent utilisateur agentic est interceptée par le programme de travail Cloudflare et acheminée vers le serveur principal d’Edge Optimize. La requête du serveur principal inclut les en-têtes requis.
Test de la requête du serveur principal
Vous pouvez vérifier le routage en adressant une requête directe au serveur principal d’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;'
En-têtes obligatoires
Les en-têtes suivants doivent être définis sur les requêtes du serveur principal d’Edge Optimize :
x-forwarded-hostwww.example.comx-edgeoptimize-url/page.html ou /products?id=123x-edgeoptimize-api-keyyour-api-key-herex-edgeoptimize-configLLMCLIENT=TRUE;Options de configuration
Il existe deux manières de configurer le programme de travail Cloudflare pour Edge Optimize :
- Option 1 : Déployer sur Cloudflare (recommandé) — Crée automatiquement un nouveau programme de travail et vous invite à saisir les variables d’environnement et les secrets requis. Utilisez cette option si vous ne disposez pas d’un programme de travail de Cloudflare existant pour ce domaine.
- Option 2 : installation manuelle — Instructions détaillées pour la création et la configuration du programme de travail vous-même. Utilisez cette option si un programme de travail Cloudflare existant est déjà configuré sur votre domaine — vous devrez fusionner le code Edge Optimize dans votre programme de travail existant (voir Étape 2 : Ajouter le code du programme de travail), ou si vous préférez un contrôle total sur le déploiement.
Quelle que soit l’option choisie, vous devez lier manuellement le programme de travail à votre domaine — voir Étape : ajouter un itinéraire à votre domaine.
Option 1 : déploiement sur Cloudflare
Cette option utilise le bouton Déployer sur Cloudflare pour créer automatiquement le programme de travail et configurer les variables d’environnement et les secrets requis dans votre compte Cloudflare. Il s’agit de la manière la plus rapide de commencer si vous configurez un nouveau programme de travail.
Étape 1 : déployer le programme de travail
Cliquez sur le bouton ci-dessous pour déployer le programme de travail d’Edge Optimize sur votre compte Cloudflare :
Étape 2 : remplissez le formulaire de déploiement
Cliquez sur le bouton pour ouvrir la page Configuration des programmes de travail. Remplissez le formulaire comme suit :
-
Compte Git — Sélectionnez votre compte GitHub ou GitLab dans la liste déroulante. Cloudflare transforme le code du programme de travail en un référentiel dans votre compte. Si aucun compte n’est répertorié, vous pouvez ajouter une nouvelle connexion directement à partir de la liste déroulante en sélectionnant + Nouvelle connexion GitHub ou + Nouvelle connexion GitLab. Pour plus d’informations, consultez le Guide d’intégration Git de Cloudflare.
-
Créer un référentiel Git privé — Gardez cette case cochée (par défaut).
-
Nom du projet — Laissez-le
edge-optimize-routerou entrez le nom de votre choix. -
EDGE_OPTIMIZE_API_KEY — Collez votre clé API Edge Optimize fournie par Adobe. Cette valeur est stockée en tant que secret chiffré.
-
EDGE_OPTIMIZE_TARGET_HOST — Entrez le domaine de votre site sans le protocole (par exemple,
www.example.com). -
Commande de build — Laisser vide.
-
Commande de déploiement — Laisser comme
npm run deploy(pré-rempli). -
Versions pour les branches hors production — Ne pas cocher. Il s’agit d’une fonctionnalité de workflow de développement qui n’est pas nécessaire pour ce déploiement.
-
Cliquez sur Créer et déployer.
Une fois le programme de travail déployé, passez à Ajouter une route à votre domaine pour lier le programme de travail à votre domaine. Le routage n’est pas configuré automatiquement et doit être effectué manuellement.
Option 2 : configuration manuelle
Pour créer et configurer manuellement le programme de travail, procédez comme suit.
Étape 1 : créer le programme de travail Cloudflare
- Connectez-vous à votre tableau de bord Cloudflare.
- Accédez à Programmes de travail et pages dans la barre latérale.
- Cliquez sur Créer une application puis sur Créer un programme de travail.
- Nommez votre programme de travail (par exemple,
edge-optimize-router). - Cliquez sur Déployer pour créer le programme de travail avec le code par défaut.
Étape 2 : ajouter le code de programme de travail
Après avoir créé le programme de travail, cliquez sur Modifier le code et remplacez le code par défaut par ce qui suit. Si vous disposez déjà d’un programme de travail de Cloudflare, fusionnez le code ci-dessous avec votre code de programme de travail existant au lieu de le remplacer entièrement.
/**
* 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;
}
Cliquez sur Enregistrer et déployer pour publier le programme de travail.
Étape 3 : Configurer les variables d’environnement et les secrets
Les variables d’environnement stockent en toute sécurité une configuration sensible telle que votre clé API.
-
Dans les paramètres de votre programme de travail, accédez à Paramètres > Variables.
-
Sous Variables d’environnement, cliquez sur Ajouter une variable.
-
Ajoutez les variables suivantes :
table 0-row-3 1-row-3 2-row-3 Nom de variable Description Nécessaires EDGE_OPTIMIZE_API_KEYVotre clé API Edge Optimize fournie par Adobe. Oui EDGE_OPTIMIZE_TARGET_HOSTL’hôte cible des requêtes Edge Optimize (envoyées en tant qu’en-tête x-forwarded-host) et le domaine d’origine pour le basculement. Doit être le domaine uniquement sans protocole (par exemple,www.example.com, pashttps://www.example.com).Oui -
Pour la clé API, cliquez sur Chiffrer pour la stocker en toute sécurité.
-
Cliquez sur Enregistrer et déployer.
Ajouter un itinéraire à votre domaine add-a-route-to-your-domain
Quelle que soit l’option de configuration utilisée, vous devez lier manuellement le programme de travail à votre domaine. Cette étape active le programme de travail sur votre trafic.
- Accédez au Paramètres > Triggers de votre programme de travail.
- Sous Itinéraires, cliquez sur Ajouter un itinéraire.
- Saisissez le modèle de votre domaine (par exemple,
www.example.com/*ouexample.com/*). - Sélectionnez la zone dans la liste déroulante.
- Cliquez sur Enregistrer.
Vous pouvez également configurer des itinéraires au niveau de la zone :
- Accédez à votre domaine dans Cloudflare.
- Accédez à Itinéraires de travail.
- Cliquez sur Ajouter un itinéraire et spécifiez le modèle et le programme de travail.
Vérification du comportement de basculement
Si Edge Optimize n’est pas disponible ou renvoie une erreur, le programme de travail bascule automatiquement sur votre origine. Les réponses de basculement incluent l’en-tête x-edgeoptimize-fo :
< HTTP/2 200
< x-edgeoptimize-fo: 1
Vous pouvez surveiller les événements de basculement dans les journaux de Cloudflare Workers pour résoudre les problèmes.
Comprendre la logique du programme de travail
Le programme de travail de Cloudflare met en œuvre la logique suivante :
-
Détection de l’agent utilisateur : vérifie si l’agent utilisateur de la requête entrante correspond à l’un des robots agentic définis (non-respect de la casse).
-
Ciblage des chemins d’accès : filtre éventuellement les requêtes en fonction des chemins d’accès ciblés. Par défaut, toutes les pages d’HTML (URL se terminant par
/, sans extension ou.html) sont acheminées. Vous pouvez spécifier des chemins d’accès spécifiques à l’aide du tableauTARGETED_PATHS. -
Protection contre les boucles : l’en-tête
x-edgeoptimize-requestempêche les boucles infinies. Lorsqu’Edge Optimize renvoie les requêtes à votre origine, cet en-tête est défini sur"1"et le programme de travail transmet la requête sans la renvoyer à Edge Optimize. -
Sécurité des en-têtes : avant de définir les en-têtes Edge Optimize, le programme de travail supprime tous les en-têtes
x-edgeoptimize-*existants de la requête entrante pour empêcher les attaques par injection d’en-tête. -
Mappage des en-têtes : le programme de travail définit les en-têtes requis pour Edge Optimize :
x-forwarded-host: identifie le domaine d’origine du site.x-edgeoptimize-url- Conserve le chemin d’accès de la requête d’origine et la chaîne de requête.x-edgeoptimize-api-key- Authentifie la requête avec Edge Optimize.x-edgeoptimize-config- Fournit la configuration de la clé de cache.
-
Logique de basculement : si Edge Optimize renvoie un code d’état d’erreur (erreurs client 4XX ou erreurs serveur 5XX) ou si la requête échoue en raison d’une erreur réseau, le programme de travail bascule automatiquement sur votre origine à l’aide de
EDGE_OPTIMIZE_TARGET_HOST. La réponse de basculement inclut l’en-têtex-edgeoptimize-fo: 1pour indiquer que le basculement s’est produit. -
Gestion des redirections : l’option
redirect: "manual"garantit que les réponses de redirection d’Edge Optimize sont transmises au client sans que le programme de travail ne les suive.
Personnalisation de la configuration
Vous pouvez personnaliser le comportement du programme de travail en modifiant les constantes de configuration en haut du code :
Liste de robots agentiques
Modifiez le tableau AGENTIC_BOTS pour ajouter ou supprimer des agents utilisateur :
const AGENTIC_BOTS = [
'AdobeEdgeOptimize-AI',
'ChatGPT-User',
'GPTBot',
'OAI-SearchBot',
'PerplexityBot',
'Perplexity-User',
// Add additional user agents as needed
'ClaudeBot',
'Anthropic-AI'
];
Chemins ciblés
Par défaut, toutes les pages HTML sont acheminées vers Edge Optimize. Pour limiter le routage à des chemins spécifiques, modifiez le tableau 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'];
Configuration de basculement
Par défaut, le programme de travail bascule sur toute erreur 4XX ou 5XX d’Edge Optimize. Personnalisez ce comportement :
// 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;
Points importants à prendre en compte
-
Comportement de basculement : le programme de travail bascule automatiquement sur votre origine si Edge Optimize renvoie une erreur (codes d’état 4XX ou 5XX) ou si la requête échoue en raison d’une erreur réseau. Le basculement utilise
EDGE_OPTIMIZE_TARGET_HOSTcomme domaine d’origine (similaire auF_Default_Originde Fastly ou auDefault_Originde CloudFront). Les réponses de basculement incluent l’en-têtex-edgeoptimize-fo: 1, que vous pouvez utiliser pour la surveillance et le débogage. -
Mise en cache : Cloudflare met en cache les réponses en fonction de l’URL par défaut. Le trafic des agents ne recevant pas le même contenu que le trafic humain, assurez-vous que la configuration du cache en tient compte. Envisagez d’utiliser l’API de cache ou les en-têtes de cache pour différencier le contenu mis en cache. L’en-tête
x-edgeoptimize-configdoit être inclus dans votre clé de cache. -
Limitation de débit : Surveillez l’utilisation d’Edge Optimizer et envisagez d’implémenter une limitation de débit pour le trafic agentic, si nécessaire.
-
Tests : testez toujours la configuration dans un environnement d’évaluation avant de la déployer en production. Vérifiez que le trafic d’agents et de personnes se comporte comme prévu. Testez le comportement de basculement en simulant les erreurs Edge Optimize.
-
Journalisation : activez la journalisation de Cloudflare Workers pour surveiller les requêtes et résoudre les problèmes. Accédez à Collaborateurs > votre collaborateur > Journaux pour afficher les journaux en temps réel. Le programme de travail consigne les événements de basculement à des fins de débogage.
Résolution des incidents
x-edgeoptimize-request-id dans la réponseAGENTIC_BOTS.EDGE_OPTIMIZE_API_KEY est correctement défini dans les variables d’environnement et les secrets. Contactez Adobe pour confirmer que votre clé API est active.x-edgeoptimize-request est en place.TARGETED_PATHS est correctement configuré.x-edgeoptimize-fo: 1 en réponseFAILOVER_ON_4XX et FAILOVER_ON_5XX sont définis sur true. Recherchez des messages d’erreur dans les journaux des collaborateurs.TARGETED_PATHS (s’il est spécifié) et correspond au modèle RegEx de page HTML.EDGE_OPTIMIZE_TARGET_HOST inclut le protocole (par exemple, https://).example.com, et non https://example.com).Autoriser l’optimisation sur Edge via des règles de pare-feu (facultatif)
Si votre réseau CDN utilise un WAF ou un gestionnaire de robots :
-
Placez sur la liste autorisée l’agent utilisateur
*AdobeEdgeOptimize/1.0*dans votre WAF ou Gestionnaire de robots afin que le service Optimize at Edge puisse récupérer votre contenu d’origine. -
Si votre pare-feu nécessite une vérification supplémentaire au-delà de l’agent utilisateur, générez un secret (par exemple,
openssl rand -hex 32) et :- Ajoutez des
x-edgeoptimize-fetcher-keyavec le secret dans vos règles de routage à côté des autres en-têtesx-edgeoptimize-*. - Ajoutez une règle WAF ou Gestionnaire de robots pour autoriser les requêtes où
x-edgeoptimize-fetcher-keycorrespond au même secret.
- Ajoutez des
-
Optimiser dans Edge transmet cet en-tête en l’état : vous êtes propriétaire du cycle de vie complet des clés.
Vérifier la configuration
Une fois la configuration terminée, vérifiez que le trafic des robots est acheminé vers Edge Optimize et que le trafic humain n’est pas affecté.
1. Tester le trafic de robots (doit être optimisé)
Simulez une requête de robot d’IA à l’aide d’une chaîne agent-utilisateur :
curl -svo /dev/null https://www.example.com/page.html \
--header "user-agent: chatgpt-user"
Une réponse réussie inclut l’en-tête x-edgeoptimize-request-id, confirmant que la requête a été acheminée via Edge Optimize :
< HTTP/2 200
< x-edgeoptimize-request-id: 50fce12d-0519-4fc6-af78-d928785c1b85
2. Tester le trafic humain (ne devrait PAS être affecté)
Simulez une requête régulière de navigateur humain :
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"
La réponse ne doit pas contenir l’en-tête x-edgeoptimize-request-id. Le contenu de la page et le temps de réponse doivent rester identiques à avant l’activation de l’option Optimiser dans Edge.
3. Comment différencier les deux scénarios
x-edgeoptimize-request-idx-edgeoptimize-fo1)Le statut du routage du trafic peut également être vérifié dans l’interface utilisateur de LLM Optimizer. Accédez à Configuration du client et sélectionnez l’onglet Configuration du réseau CDN.
Pour en savoir plus sur l’optimisation sur Edge, y compris sur les opportunités disponibles, les workflows d’optimisation automatique et les questions fréquentes, revenez à la Présentation de l’optimisation sur Edge .