← Speed / speed / optimization / content
Sdílené slovníky
Sdílené slovníky (RFC 9842 ↗) umožňují vašemu originu komprimovat odpověď oproti kopii stejného, případně jiného, zdroje, který už prohlížeč návštěvníka má uložený v cache. Po síti pak putuje jen rozdíl mezi těmito dvěma zdroji.
Nejlépe to funguje u verzovaných assetů, které se mezi jednotlivými nasazeními mění postupně, například u JavaScript bundlů, CSS souborů nebo frameworkových chunků. Po nasazení tak vracející se návštěvníci mohou místo opětovného stahování celého souboru získat nový asset jen jako malou deltu oproti verzi, kterou už mají.
Cloudflare podporuje sdílené slovníky v passthrough režim: váš origin server spravuje slovníky a vytváří delta komprimované odpovědi. Cloudflare předává hlavičky slovníku a dcb/dcz kódování obsahu, aniž by je upravoval nebo znovu komprimoval, a odlišuje cache tak, aby se každá varianta s delta kompresí ukládala zvlášť.
Základní informace o dalších kompresních algoritmech podporovaných Cloudflare najdete v Komprese obsahu.
Dostupnost
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
| Dostupnost | Ano (beta) | Ano (beta) | Ano (beta) | Ano (beta) |
Požadavky
Sdílené slovníky fungují, pokud platí všechny následující podmínky:
- Prohlížeč návštěvníka podporuje přenos kompresního slovníku ↗. V současnosti se jedná o Chrome 130 nebo novější, Edge 130 nebo novější, případně jiný prohlížeč založený na Chromiu ve stejné verzi.
- Požadavek prohlížeče obsahuje
dcbnebodczvAccept-EncodingaAvailable-Dictionaryhlavička. - Váš origin server vrací delta komprimovanou odpověď s
Content-Encoding: dcbnebodczaVarykterá obsahujeAccept-Encoding, Available-Dictionary. - Slovník, delta odpověď i požadavek jsou poskytovány přes HTTPS ze stejného originu. Podle RFC 9842, Section 8 ↗, přenos kompresních slovníků funguje pouze přes HTTPS.
Jak fungují sdílené slovníky
Protokol používá dvě nové hlavičky požadavku a odpovědi a dvě nová kódování obsahu:
| Hlavička | Směr | Účel |
|---|---|---|
Use-As-Dictionary |
Origin → prohlížeč | Označí odpověď jako použitelnou jako slovník pro budoucí požadavky odpovídající zadanému match hodnota. |
Available-Dictionary |
Prohlížeč → origin | Oznamuje hash SHA-256 slovníku, který prohlížeč již má pro danou URL požadavku. |
Content-Encoding: dcb nebo dcz |
Origin → prohlížeč | Delta komprimováno oproti nabízenému slovníku pomocí Brotli (dcb) nebo Zstandard (dcz). |
První odpověď pro verzované aktivum obsahuje Use-As-Dictionary, a prohlížeč odpověď uloží. Při dalších požadavcích na prostředky odpovídající tomuto vzoru prohlížeč odešle Available-Dictionary: :<sha256>: a přidává dcb, dcz na Accept-Encoding. Váš origin nový prostředek zkomprimuje oproti slovníku a vrátí ho s Content-Encoding: dcb nebo dcz. Prohlížeč použije svou uloženou kopii k rekonstrukci úplné odpovědi.
match hodnotu v Use-As-Dictionary je WHATWG URL Pattern ↗, nikoli regulární výraz. Vzory pro shodu pracují s procentuálně kódovanou cestou URL adresy a vztahují se ke stejnému originu jako slovník.
Available-Dictionary hodnota je Structured Field ↗ bajtovou sekvenci: hash SHA-256 zakódovaný v base64 a uzavřený mezi dvojtečkami (například :pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4=:). Dvojtečky jsou součástí syntaxe.
Zapněte sdílené slovníky
Povolení sdílených slovníků se skládá ze dvou částí:
- Zapněte pro vaši zónu v Cloudflare režim passthrough. Tím dáte Cloudflare pokyn, aby předával hlavičky slovníku a správně rozlišoval položky v mezipaměti pomocí hlavičky Vary.
- Aktualizujte svůj origin server tak, aby označoval soubory jako slovníky a vracel vůči nim delta komprimované odpovědi.
Vytváření slovníků a komprimace nových odpovědí vůči nim probíhá na vašem origin serveru, nikoli na straně Cloudflare.
1. Povolte passthrough v Cloudflare
Pokud chcete zapnout sdílené slovníky v dashboardu:
-
V Cloudflare dashboardu přejděte na Speed Nastavení stránce.
Přejděte na Nastavení ↗ -
Přejděte na Optimalizace obsahu.
-
Přepnout Sdílené slovníky na On.
Použijte následující PATCH a zapněte tak sdílené slovníky:
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/shared_dictionary_mode" \
--request PATCH \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"value": "passthrough"
}'Pokud chcete sdílené slovníky vypnout, nastavte value na "disabled".
Platné hodnoty tohoto nastavení jsou:
| Hodnota | Chování |
|---|---|
passthrough |
Cloudflare předává hlavičky požadavků a odpovědí pro sdílené slovníky, přijímá dcb/dcz z origin serveru a odlišuje položky v cache. |
disabled |
Cloudflare odstraňuje hlavičky sdílených slovníků a neukládá do mezipaměti dcb/dcz variant. |
Sdílené slovníky můžete nakonfigurovat pomocí cloudflare_zone_settings_override prostředek. Další podrobnosti najdete v Dokumentace Terraform ↗.
2. Označte prostředky jako slovníky na svém originu
Pro každé verzované aktivum, které chcete použít jako slovník, přidejte Use-As-Dictionary v první odpovědi:
Use-As-Dictionary: match="/static/app-*.js", type="raw"
Cache-Control: public, max-age=31536000, immutable
Content-Encoding: br match hodnota říká prohlížeči, které budoucí URL adresy požadavků mají tento slovník nabízet. Jde o vzor WHATWG URL Pattern, nepodporuje regulární výrazy a musí se vztahovat ke stejnému originu jako slovník.
3. Komprimujte nové verze oproti nabízenému slovníku
Když dorazí požadavek s Available-Dictionary vyhledejte slovník podle jeho hash SHA-256. Pokud ho máte, zkomprimujte odpověď vůči němu a vraťte:
Content-Encoding: dcz
Vary: Accept-Encoding, Available-Dictionary
Cache-Control: public, max-age=31536000, immutableRFC 9842, Section 6.2 ↗ vyžaduje Vary: Accept-Encoding, Available-Dictionary odpovědi, aby cache prohlížečů neposkytovaly nesprávnou variantu. Pokud je zapnutý průchod, cache Cloudflare se také řídí podle těchto hlaviček.
4. Použijte záložní řešení, pokud není k dispozici žádný slovník
Pokud prohlížeč neuvádí Available-Dictionary, hash neodpovídá žádnému slovníku, který máte k dispozici, nebo ho prohlížeč nenabízí dcb/dcz, vraťte odpověď s běžnou kompresí Brotli, Zstandard nebo Gzip.
Možnosti implementace
Cloudflare nepředepisuje konkrétní implementaci origin serveru. Mezi obvyklá výchozí řešení patří:
- Reverzní proxy. Nakonfigurujte NGINX, Caddy nebo podobný proxy server tak, aby připojoval
Use-As-Dictionarya vytváří delta odpovědi pomocí sidecar procesu. - Nativní podpora ve vašem aplikačním serveru. Rozšiřte svůj stávající middleware pro kompresi tak, aby četl
Available-Dictionarya vydávajídcbnebodcz.
Testování sdílených slovníků
Pokud chcete ověřit, že požadavek používá sdílený slovník, vyžádejte si asset dvakrát. Druhý požadavek inzeruje slovník, který jste obdrželi v první odpovědi.
# Prime the dictionary.
curl -sI -H "Accept-Encoding: br, gzip, zstd, dcb, dcz" \
https://example.com/static/app.v1.js
# Request the next version, advertising the dictionary you just received.
# Replace <hash> with the base64-encoded SHA-256 of the first response.
# The surrounding colons are part of the Structured Field syntax
# and are required by RFC 9842, Section 2.2.
curl -sI -H "Accept-Encoding: br, gzip, zstd, dcb, dcz" \
-H "Available-Dictionary: :<hash>:" \
https://example.com/static/app.v2.jsDruhá odpověď by měla obsahovat Content-Encoding: dcz (nebo dcb), Vary: Accept-Encoding, Available-Dictionary, a Content-Length výrazně menší než odpověď bez delta komprese.
Můžete také použít canicompress.com ↗ abyste ověřili, že váš prohlížeč podporuje sdílené slovníky, a prohlédli si funkční odpověď komprimovanou pomocí delta kódování.
Omezení
- Je nutný zásah na straně originu. V režimu passthrough Cloudflare negeneruje slovníky ani nepočítá delty. Pokud váš origin negeneruje
dcb/dczk žádné úspoře díky kompresi nedochází. - Funkce upravující tělo odpovědi nejsou kompatibilní. Funkce Cloudflare, které přepisují těla odpovědí, u odpovědí s delta kompresí nefungují. Tyto funkce na cestách se slovníkovou kompresí vypněte, nebo nastavte
cache-control: no-transformv odpovědi origin serveru. Podrobnosti najdete v Komprese obsahu. - Podpora v prohlížečích je částečná. Návštěvníci s prohlížeči, které nežádají
dcbnebodcznadále dostávají Brotli, Zstandard nebo Gzip podle vašeho stávajícího Compression Rules a výchozí chování komprese. - Pouze same-origin. Za RFC 9842, Section 9.3.1 ↗, slovníky se vztahují vždy k originu odpovědi. Použití slovníku napříč originy není podporováno.