← Cloudflare Cache / cache / advanced-configuration
Poskytování přizpůsobeného obsahu s Cloudflare
Vyjednávání obsahu je postup, kdy se z jedné URL adresy doručují různé verze prostředku a zážitek se přizpůsobuje konkrétnímu koncovému uživateli. Mezi běžné příklady patří doručení obsahu v konkrétním jazyce (Accept-Language), optimalizaci pro zařízení (User-Agent), nebo doručování moderních formátů obrázků (Accept).
Globální síť Cloudflare je navržená tak, aby toto zvládala ve velkém měřítku. U běžných scénářů, jako je doručování obrázků nové generace, tuto negociaci zjednodušuje vyhrazená funkce. Pro individuálnější logiku nabízí Cloudflare sadu nástrojů zahrnující Transform Rules, Snippets, Custom Cache Keys a Workers, díky nimž máte podrobnou kontrolu nad tím, aby se každému uživateli vždy zobrazil ten správný obsah.
Použití řetězců dotazu
Transform Rule metoda je ideální, pokud dokážete vytvořit odlišnou URL adresu, například při zobrazování obsahu podle polohy návštěvníka.
Příklad geolokace
V tomto příkladu provozujete e-shop a chcete zobrazovat ceny v místní měně podle země návštěvníka.
-
V Cloudflare dashboardu přejděte do sekce Rules Přehled stránce.
Přejděte na Přehled ↗ -
Vyberte Vytvořit pravidlo a vyberte možnost URL Rewrite Rule.
-
Zadejte popisný název, například
Vary by Country - Canada. -
V Pokud příchozí požadavky odpovídají..., vyberte Custom filter expression.
-
V části Když příchozí požadavky odpovídají..., vytvořte následující výraz:
- Pole:
Country - Operátor:
equals - Hodnota:
Canada
- Pole:
-
V části Poté...
- pro Cesta, vyberte Zachovat.
- pro Dotaz, vyberte Přepsat na: Dynamický
loc=ca
-
Vyberte Save.
Nyní požadavky z Kanady na /products/item bude převedena na /products/item?loc=ca ještě předtím, než dosáhne vašeho originu nebo mezipaměti, čímž vznikne samostatná položka v mezipaměti.
Vary pro obrázky
Vary pro obrázky říká Cloudflare, které varianty váš origin podporuje. Cloudflare pak každou verzi ukládá zvlášť do mezipaměti a prohlížečům servíruje správnou verzi bez nutnosti pokaždé kontaktovat váš origin. Tuto funkci spravujete přes Cloudflare API.
Zapnutí Vary pro obrázky
Chcete-li tuto funkci zapnout, vytvořte pravidlo pro varianty pomocí API. Toto pravidlo mapuje přípony souborů na formáty obrázků, které váš origin umí obsluhovat.
Následující volání API například Cloudflare sděluje, že pro .jpeg a .jpg souborů může váš origin poskytovat image/webp a image/avif varianty:
Požadovaná oprávnění API tokenu
Alespoň jeden z následujících oprávnění tokenu je povinné:Zone Settings WriteZone Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/cache/variants" \
--request PATCH \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"value": {
"jpeg": [
"image/webp",
"image/avif"
],
"jpg": [
"image/webp",
"image/avif"
]
}
}'Po vytvoření pravidla Cloudflare vytvoří samostatnou položku v mezipaměti pro každou variantu obrázku, což zlepší výkon pro uživatele s moderními prohlížeči.
Použití Snippets pro programové ukládání do mezipaměti
Snippets jsou samostatné JavaScriptové fetch handlery, které běží na edge serverech Cloudflare nad vašimi požadavky. Umožňují programově pracovat s mezipamětí a poskytují plnou kontrolu nad klíčem mezipaměti i chováním odpovědi, aniž by se změnila URL adresa viditelná pro uživatele.
Příklad: A/B testování
V tomto příkladu provozujete A/B test řízený cookie s názvem ab-test (s hodnotami group-a nebo group-b). Pro každou skupinu chcete v cache uchovávat jinou verzi stránky.
-
V dashboardu Cloudflare přejděte na Snippets stránce.
Přejděte na Snippets ↗ -
Vyberte Create new Snippet a pojmenujte ho
ab-test-caching. -
Vložte následující kód. Upravuje cache key na základě
ab-testcookie a odpověď uloží do mezipaměti na 30 dní.
const CACHE_DURATION = 30 * 24 * 60 * 60; // 30 days
export default {
async fetch(request) {
// Construct a new URL for the cache key based on the A/B cookie
const abCookie = request.headers.get('Cookie')?.match(/ab-test=([^;]+)/)?.[1] || 'control';
const url = new URL(request.url);
url.pathname = `/ab-test/${abCookie}${url.pathname}`;
const cacheKey = new Request(url, request);
const cache = caches.default;
let response = await cache.match(cacheKey);
if (!response) {
// If not in cache, fetch from origin
response = await fetch(request);
response = new Response(response.body, response);
response.headers.set("Cache-Control", `s-maxage=${CACHE_DURATION}`);
// Put the response into cache with the custom key
await cache.put(cacheKey, response.clone());
}
return response;
},
};- Uložte a nasaďte Snippet.
- V dashboardu Snippets vyberte Připojit k trasám přiřadit Snippet.
Custom Cache Keys (Enterprise)
Pokud má váš účet plán Enterprise, Custom Cache Keys funkce nabízí rozhraní bez psaní kódu, ve kterém určíte, které vlastnosti požadavku se zahrnou do cache key.
Možnosti Custom Cache Key:
- Cache podle typu zařízení
- Možnost query string
No query string parameters except - Zahrnout hlavičky a hodnoty
- Zahrnout názvy a hodnoty cookies
- Uživatel: typ zařízení, země, jazyk
Příklad: Stejná URL, jiný obsah
Pokud váš origin server poskytuje různé typy obsahu (například application/json oproti text/html) na stejné adrese URL na základě Accept hlavičky použijte vlastní cache key, abyste je ukládali do mezipaměti odděleně.
-
V dashboardu Cloudflare přejděte na Cache Rules stránce.
Přejděte na Cache Rules ↗ -
Vyberte Vytvořit pravidlo.
-
Zadejte název pravidla, například
Vary by Accept Header. -
Nastavte podmínku pro použití pravidla (například konkrétní hostitel nebo cesta).
-
V části Cache key, vyberte Použití vlastního klíče.
-
Vyberte Přidat nové.
- Typ:
Header - Název:
Accept - Hodnota: Přidejte jednotlivé
value, nebo ponechte prázdné pro všechny.
- Typ:
-
Vyberte Nasadit.
Tato konfigurace vytváří samostatné záznamy v cache na základě Accept hodnotu hlavičky s ohledem na vyjednávání obsahu (content negotiation) vašeho API.
Použití Cloudflare Workers pro pokročilou logiku
Pro složitější scénáře ukládání do mezipaměti, Cloudflare Workers poskytují plnohodnotné serverless prostředí ideální pro vlastní logiku ve velkém měřítku.
Příklad: Typ zařízení - Free/Pro/Biz (bez Tiered Cache)
Tento Worker rozpozná, zda návštěvník používá mobilní, nebo desktopové zařízení, a pro každé z nich vytvoří samostatný záznam v cache, čímž zajistí obsloužení a cachování správné verze webu.
export default {
async fetch(request, env, ctx) {
const userAgent = request.headers.get('User-Agent') || '';
const deviceType = userAgent.includes('Mobile') ? 'mobile' : 'desktop';
// Create a new URL for the cache key that includes the device type
const url = new URL(request.url);
url.pathname = `/${deviceType}${url.pathname}`;
const cacheKey = new Request(url, request);
const cache = caches.default;
let response = await cache.match(cacheKey);
if (!response) {
console.log(`Cache miss for ${deviceType} device. Fetching from origin.`);
response = await fetch(request);
let responseToCache = response.clone();
ctx.waitUntil(cache.put(cacheKey, responseToCache));
}
return response;
},
};Příklad: Typ zařízení - Enterprise (s Tiered Cache)
Tento Worker rozpozná, zda návštěvník používá mobilní zařízení, nebo desktop, a pro každý typ vytvoří samostatný záznam v cache, čímž zajistí obsloužení a cachování správné verze webu. Využívá funkci Enterprise cf.customCacheKey funkce.
export default {
async fetch(request) {
// 1. Determine the device type from the User-Agent header
const userAgent = request.headers.get('User-Agent') || '';
const deviceType = userAgent.includes('Mobile') ? 'mobile' : 'desktop';
// 2. Create a custom cache key by appending the device type to the URL
const customCacheKey = `${request.url}-${deviceType}`;
// 3. Fetch the response. Cloudflare's cache automatically uses the
// customCacheKey for cache operations (match, put).
const response = await fetch(request, {
cf: {
cacheKey: customCacheKey,
},
});
// Optionally, you can modify the response before returning it
// For example, add a header to indicate which cache key was used
const newResponse = new Response(response.body, response);
newResponse.headers.set("X-Cache-Key", customCacheKey);
return newResponse;
},
};Příklad: Cachování payloadů Next.js RSC
Běžným problémem je ukládání do mezipaměti obsahu z frameworků, jako je Next.js, které používají RSC (React Server Components) hlavičku požadavku, která rozlišuje mezi načtením HTML stránky a datovým obsahem RSC pro stejnou URL adresu. Zde jsou nejlepší způsoby, jak to řešit.
Metoda 1: Transform Rules
Nejjednodušším řešením je vytvořit Transform Rule která kontroluje RSC hlavičku a přidá k požadavku jedinečný query parametr, čímž vzniknou dvě odlišné URL, které lze uložit do mezipaměti: /page (pro HTML) a /page?_rsc=1 (pro datový obsah RSC).
-
V Cloudflare dashboardu přejděte do sekce Rules Přehled stránce.
Přejděte na Přehled ↗ -
Vyberte Vytvořit pravidlo a vyberte možnost URL Rewrite Rule.
-
Zadejte název, například
Vary by RSC Header. -
V Pokud příchozí požadavky odpovídají, vyberte Custom filter expression.
-
V části Když příchozí požadavky odpovídají, ručně upravte výraz tak, aby kontroloval přítomnost
RSChlavičku:has_key(http.request.headers, "rsc")
-
V části Poté:
- Pro Cesta, vyberte Zachovat.
- Pro Dotaz, vyberte Přepsat na, vyberte Statický:
_rsc=1.
-
Vyberte Save.
Metoda 2: Snippets nebo Custom Cache Keys
Případně použijte Snippets nebo Custom Cache Keys přidat RSC hlavičku přímo do cache key, aniž by se změnila viditelná URL. Výsledkem je přehlednější URL, ale je potřeba pokročilejší konfigurace.