INTEGRITY Документация

Общие словари

Общие словари (RFC 9842 ↗) позволяют источнику сжимать ответ относительно копии того же ресурса или другого ресурса, который уже есть в кэше браузера посетителя. По сети передаётся только разница между двумя ресурсами.

Это наиболее эффективно для версионированных ресурсов, которые меняются постепенно от деплоя к деплою, таких как JavaScript-бандлы, CSS-файлы и чанки фреймворков. После деплоя вернувшиеся посетители могут получить новую версию ресурса в виде небольшой дельты относительно уже имеющейся у них версии, вместо повторной загрузки всего файла.

Cloudflare поддерживает общие словари в passthrough режим: ваш origin управляет словарями и формирует ответы, сжатые с использованием delta-сжатия. Cloudflare передаёт заголовки словарей и dcb/dcz кодировки содержимого без их изменения или повторного сжатия, а также варьирует кеш так, чтобы каждый дельта-сжатый вариант хранился отдельно.

Общие сведения о других алгоритмах сжатия, поддерживаемых Cloudflare, см. в Сжатие контента.


Доступность

Free Pro Business Enterprise
Доступность Да (бета) Да (бета) Да (бета) Да (бета)

Требования

Общие словари работают, если выполняются все перечисленные условия:


Как работают общие словари

Протокол использует два новых заголовка запроса и ответа, а также два новых типа кодирования содержимого:

Header Направление Назначение
Use-As-Dictionary Источник → браузер Помечает ответ как пригодный для использования в качестве словаря для будущих запросов, соответствующих указанному match значение.
Available-Dictionary Браузер → источник Сообщает хеш SHA-256 словаря, который уже есть у браузера для URL запроса.
Content-Encoding: dcb или dcz Источник → браузер Дельта-сжатие относительно объявленного словаря с использованием Brotli (dcb) или Zstandard (dcz).

Первый ответ для версионированного ресурса включает Use-As-Dictionary, и браузер сохраняет ответ. При последующих запросах ресурсов, соответствующих шаблону, браузер отправляет Available-Dictionary: :<sha256>: и добавляет dcb, dcz к Accept-Encoding. Ваш источник сжимает новый ресурс относительно словаря и возвращает его с Content-Encoding: dcb или dcz. Браузер использует сохраненную копию, чтобы восстановить полный ответ.

match значение в Use-As-Dictionary это WHATWG URL Pattern ↗, а не регулярное выражение. Шаблоны сопоставления работают с процентно-кодированным путем URL и привязаны к тому же источнику, что и словарь.

Available-Dictionary value представляет собой Structured Field ↗ последовательность байт: хеш SHA-256 в кодировке base64, заключенный в двоеточия (например, :pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4=:). Двоеточия являются частью синтаксиса.


Включите общие словари

Включение общих словарей состоит из двух этапов:

  1. Включите passthrough для вашей зоны в Cloudflare. Это указывает Cloudflare передавать заголовки словаря и корректно варьировать записи кэша.
  2. Настройте исходный сервер так, чтобы он помечал ресурсы как словари и возвращал для них дельта-сжатые ответы.

Создание словарей и сжатие новых ответов с их помощью происходит на вашем origin-сервере, а не на стороне Cloudflare.

1. Включите passthrough в Cloudflare

Чтобы включить общие словари в дашборде:

  1. В панели управления Cloudflare перейдите в раздел Speed Настройки страницу.

    Перейдите в Настройки ↗
  2. Перейдите в Оптимизация контента.

  3. Переключить Общие словари к Включено.

Используйте следующее PATCH запрос, чтобы включить общие словари:

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"
	}'

Чтобы отключить общие словари, установите value к "disabled".

Допустимые значения этого параметра:

Значение Поведение
passthrough Cloudflare передаёт заголовки запроса и ответа для общих словарей, принимает dcb/dcz ответы от origin и различает записи кеша.
disabled Cloudflare удаляет заголовки общих словарей и не кэширует dcb/dcz варианты.

Общие словари можно настроить с помощью cloudflare_zone_settings_override ресурс. Подробности см. в Документация Terraform ↗.

2. Пометьте ресурсы как словари на своём источнике

Для каждого версионированного ресурса, который нужно использовать в качестве словаря, добавьте Use-As-Dictionary заголовок в первом ответе:

Use-As-Dictionary: match="/static/app-*.js", type="raw"
Cache-Control: public, max-age=31536000, immutable
Content-Encoding: br

match value указывает браузеру, для каких будущих URL запросов нужно объявлять этот словарь. Это WHATWG URL Pattern, регулярные выражения не поддерживаются, а итоговый URL должен относиться к тому же источнику, что и словарь.

3. Сжимайте новые версии относительно анонсированного словаря

Когда запрос поступает с Available-Dictionary заголовок, найдите словарь по его хешу SHA-256. Если он у вас есть, сжмите ответ с его использованием и верните:

Content-Encoding: dcz
Vary: Accept-Encoding, Available-Dictionary
Cache-Control: public, max-age=31536000, immutable

RFC 9842, Section 6.2 ↗ требует Vary: Accept-Encoding, Available-Dictionary заголовок ответа, чтобы кеши браузера не отдавали неверный вариант. Кеш Cloudflare также учитывает эти заголовки при включённом passthrough.

4. Резервный вариант при отсутствии словаря

Когда браузер не заявляет о поддержке Available-Dictionary, хеш не совпадает ни с одним имеющимся у вас словарем, либо браузер не анонсирует dcb/dcz, верните ответ с обычным сжатием Brotli, Zstandard или Gzip.

Варианты внедрения

Cloudflare не предписывает конкретную реализацию на стороне источника. Распространённые отправные точки включают:


Протестируйте общие словари

Чтобы убедиться, что запрос использует общий словарь, запросите ресурс дважды. Второй запрос анонсирует словарь, полученный в первом ответе.

# 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

Второй ответ должен включать Content-Encoding: dcz (или dcb), Vary: Accept-Encoding, Available-Dictionary, а также Content-Length значительно меньше, чем ответ без delta-сжатия.

Также можно использовать canicompress.com ↗ , чтобы убедиться, что ваш браузер поддерживает общие словари, и посмотреть на практике ответ со сжатием на основе дельты.


Ограничения