INTEGRITY Dokumentace

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:


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í:

  1. 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.
  2. 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:

  1. V Cloudflare dashboardu přejděte na Speed Nastavení stránce.

    Přejděte na Nastavení ↗
  2. Přejděte na Optimalizace obsahu.

  3. 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, immutable

RFC 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ří:


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.js

Druhá 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í