← Speed / speed / optimization / content
Общие словари
Общие словари (RFC 9842 ↗) позволяют источнику сжимать ответ относительно копии того же ресурса или другого ресурса, который уже есть в кэше браузера посетителя. По сети передаётся только разница между двумя ресурсами.
Это наиболее эффективно для версионированных ресурсов, которые меняются постепенно от деплоя к деплою, таких как JavaScript-бандлы, CSS-файлы и чанки фреймворков. После деплоя вернувшиеся посетители могут получить новую версию ресурса в виде небольшой дельты относительно уже имеющейся у них версии, вместо повторной загрузки всего файла.
Cloudflare поддерживает общие словари в passthrough режим: ваш origin управляет словарями и формирует ответы, сжатые с использованием delta-сжатия. Cloudflare передаёт заголовки словарей и dcb/dcz кодировки содержимого без их изменения или повторного сжатия, а также варьирует кеш так, чтобы каждый дельта-сжатый вариант хранился отдельно.
Общие сведения о других алгоритмах сжатия, поддерживаемых Cloudflare, см. в Сжатие контента.
Доступность
| Free | Pro | Business | Enterprise | |
|---|---|---|---|---|
| Доступность | Да (бета) | Да (бета) | Да (бета) | Да (бета) |
Требования
Общие словари работают, если выполняются все перечисленные условия:
- Браузер посетителя поддерживает передача словаря сжатия ↗. На сегодняшний день это Chrome 130 и новее, Edge 130 и новее или другой браузер на базе Chromium той же версии.
- Запрос браузера включает
dcbилиdczвAccept-EncodingиAvailable-Dictionaryзаголовок. - Источник возвращает дельта-сжатый ответ с
Content-Encoding: dcbилиdczиVaryзаголовок, включающийAccept-Encoding, Available-Dictionary. - Словарь, дельта-ответ и сам запрос передаются по HTTPS с одного и того же источника. Согласно RFC 9842, Section 8 ↗, передача словарей сжатия возможна только по HTTPS.
Как работают общие словари
Протокол использует два новых заголовка запроса и ответа, а также два новых типа кодирования содержимого:
| 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=:). Двоеточия являются частью синтаксиса.
Включите общие словари
Включение общих словарей состоит из двух этапов:
- Включите passthrough для вашей зоны в Cloudflare. Это указывает Cloudflare передавать заголовки словаря и корректно варьировать записи кэша.
- Настройте исходный сервер так, чтобы он помечал ресурсы как словари и возвращал для них дельта-сжатые ответы.
Создание словарей и сжатие новых ответов с их помощью происходит на вашем origin-сервере, а не на стороне Cloudflare.
1. Включите passthrough в Cloudflare
Чтобы включить общие словари в дашборде:
-
В панели управления Cloudflare перейдите в раздел Speed Настройки страницу.
Перейдите в Настройки ↗ -
Перейдите в Оптимизация контента.
-
Переключить Общие словари к Включено.
Используйте следующее 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, immutableRFC 9842, Section 6.2 ↗ требует Vary: Accept-Encoding, Available-Dictionary заголовок ответа, чтобы кеши браузера не отдавали неверный вариант. Кеш Cloudflare также учитывает эти заголовки при включённом passthrough.
4. Резервный вариант при отсутствии словаря
Когда браузер не заявляет о поддержке Available-Dictionary, хеш не совпадает ни с одним имеющимся у вас словарем, либо браузер не анонсирует dcb/dcz, верните ответ с обычным сжатием Brotli, Zstandard или Gzip.
Варианты внедрения
Cloudflare не предписывает конкретную реализацию на стороне источника. Распространённые отправные точки включают:
- Обратный прокси-сервер. Настройте NGINX, Caddy или аналогичный прокси-сервер так, чтобы он добавлял
Use-As-Dictionaryзаголовки и формирует delta-ответы с помощью sidecar-процесса. - Нативная поддержка на уровне сервера приложений. Расширьте существующее промежуточное ПО для сжатия так, чтобы оно считывало
Available-Dictionaryи выводятdcbилиdcz.
Протестируйте общие словари
Чтобы убедиться, что запрос использует общий словарь, запросите ресурс дважды. Второй запрос анонсирует словарь, полученный в первом ответе.
# 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 ↗ , чтобы убедиться, что ваш браузер поддерживает общие словари, и посмотреть на практике ответ со сжатием на основе дельты.
Ограничения
- Требуются изменения на стороне источника. В режиме passthrough Cloudflare не создает словари и не вычисляет дельты. Если ваш исходный сервер не формирует
dcb/dczответов экономия на сжатии не достигается. - Функции, изменяющие тело ответа, несовместимы. Функции Cloudflare, которые перезаписывают тело ответа, не работают с дельта-сжатыми ответами. Отключите эти функции для путей со словарным сжатием или задайте
cache-control: no-transformв ответе origin. Подробности см. в Сжатие контента. - Поддержка браузерами частичная. Посетители, использующие браузеры, которые не запрашивают
dcbилиdczпродолжают получать Brotli, Zstandard или Gzip в соответствии с вашими существующими Compression Rules и поведение сжатия по умолчанию. - Только запросы same-origin. За RFC 9842, Section 9.3.1 ↗, словари привязаны к источнику ответа. Использование словаря для другого источника не поддерживается.