HTTPQUERY
Русский

Accept-Encoding

Применение

Заголовок запроса HTTP Accept-Encoding является частью процесса согласования содержимого и указывает, какие методы кодирования поддерживает клиент. Сервер выбирает один из доступных методов и затем сообщает клиенту о своём выборе, включив заголовок Content-Encoding в HTTP-ответ.

Примечание

В некоторых случаях, даже когда клиент и сервер поддерживают одни и те же методы кодирования, исходный ресурс перед отправкой не преобразуется. Так происходит в ситуациях, когда значение identity для ресурса тоже приемлемо. Один из распространённых примеров — данные уже сжаты, и применение ещё одного алгоритма сжатия не уменьшит размер дополнительно. Это случается с предварительно сжатыми файлами изображений, например JPEG. Другая ситуация — сервер сильно нагружен и не может выделить ресурсы, необходимые для преобразования данных перед передачей.

Несколько кодировок указываются отдельными заголовками HTTP Accept-Encoding либо, как вариант, списком через запятую. Дополнительно передаётся q-фактор, обозначающий предпочтение или приоритет.

Влияние на SEO

Поисковые роботы и сборщики данных Google поддерживают кодирования содержимого gzip, deflate и Brotli (br). Каждый user agent Google объявляет поддерживаемые кодировки в заголовке Accept-Encoding каждого запроса, как правило в виде Accept-Encoding: gzip, deflate, br. Отдача сжатых ответов роботу Googlebot снижает расход трафика и время сканирования. Bingbot отправляет Accept-Encoding: gzip, deflate.

gzip

Директива gzip указывает, что клиент поддерживает сжатие GNU zip. Это самая широко поддерживаемая кодировка в вебе.

deflate

Директива deflate указывает, что клиент поддерживает сжатие zlib. Несмотря на название, здесь используется обёртка zlib вокруг сырых данных, сжатых алгоритмом DEFLATE.

br

Директива br указывает, что клиент поддерживает сжатие Brotli. Для текстового содержимого Brotli обычно даёт лучшую степень сжатия, чем gzip.

zstd

Директива zstd указывает, что клиент поддерживает сжатие Zstandard. Zstandard обеспечивает высокую степень сжатия при быстрой распаковке.

identity

Директива identity указывает, что кодирование не применяется. Это значение всегда считается приемлемым, если оно явно не исключено записью identity;q=0.

* (подстановочный знак)

Подстановочный знак * соответствует любой кодировке, ещё не перечисленной в заголовке. Если заголовок Accept-Encoding отсутствует, сервер обрабатывает запрос так, как если бы был указан *.

;q= (весовые коэффициенты качества)

Параметр ;q= назначает каждой кодировке вес от 0 до 1, где 1 — наивысший приоритет, а 0 означает «неприемлемо». Если параметр опущен, значение качества по умолчанию равно 1. Сервер использует эти веса для выбора предпочтительной кодировки.

Пример

В этом примере клиент просит сервер использовать один из нескольких методов кодирования. В первом варианте всем параметрам задан одинаковый приоритет. Во втором варианте директива q-value назначает вес приоритету кодировки. Сервер отвечает списком применённых кодировок в том порядке, в котором они были обработаны.

Запрос (вариант №1)

GET / HTTP/1.1
Host: example.com
Accept-Encoding: gzip
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *

Запрос (вариант №2)

GET / HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br;q=1.0, identity;q=0.5, *;q=0.25

Ответ

HTTP/1.1 200 OK
Content-Encoding: gzip, br

Диагностика

Сжатие не применяется, несмотря на Accept-Encoding. Некоторые обратные прокси удаляют Accept-Encoding из запроса перед его пересылкой. В nginx исходное значение сохраняет proxy_set_header Accept-Encoding $http_accept_encoding. Проверьте с помощью curl -H “Accept-Encoding: gzip” -I.

Выбрана неожиданная кодировка. Весовые коэффициенты качества (q-факторы) задают порядок предпочтения. Запрос с Accept-Encoding: gzip;q=0.5, br;q=1.0 предпочитает Brotli. Без q-значений все варианты получают одинаковый вес, и сервер выбирает произвольно.

Accept-Encoding отсутствует в предварительном запросе CORS. Заголовок Accept-Encoding входит в безопасный список CORS и не вызывает предварительный запрос. Если сжатие перестаёт работать при кросс-доменных запросах, проверьте, применяет ли сервер сжатие независимо от заголовка Origin.

CDN отдаёт несжатые ответы. Некоторые CDN сжимают содержимое только тогда, когда источник отдаёт несжатый ответ с подходящим Content-Type. Убедитесь, что источник отвечает с Vary: Accept-Encoding, чтобы CDN кэшировала сжатые и несжатые варианты по отдельности.

Кодирование identity отклонено. Отправка Accept-Encoding: identity;q=0 сообщает серверу, что клиент не может принимать несжатые ответы. Если ни одна поддерживаемая кодировка недоступна, сервер возвращает 406 Not Acceptable. Не задавайте identity значение q=0, если нет гарантии, что все перечисленные кодировки доступны.