Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Модуль mod_deflate

 

15.03.2004

Версия 1.0.21

Модуль mod_deflate кодирует HTTP-ответ методами gzip и deflate, что позволяет уменьшить размер передаваемых данных в 2 и более раз. mod_deflate представляет из себя собственно модуль и набор патчей для Apache и модуля mod_charset (Russian Apache).

Содержание

Установка
Как это работает
Некоторые рекомендации
Что можно сжимать
Какие бывают методы кодирования
Директивы
DeflateCompLevel
DeflateDisableRange
DeflateEnable
DeflateHTTP
DeflateHash
DeflateIdleCheck
DeflateIgnoreFlush
DeflateMaxProcesses
DeflateMinIdle
DeflateMinLength
DeflateOrder
DeflateProxied
DeflateTypes
DeflateVary
DeflateWindow
Что можно записать в лог
Переменные среды
Ресурсы: память и процессор
Известные ошибки и особенности
Браузеры, что они умеют
Использование заголовка "Vary"
Прокси-сервера

Установка

Дистрибутив необходимо распаковать, перейти в каталог с исходными текстами и выполнить команду ./configure, указав ей путь к исходными текстам Apache. После конфигурирования нужно выполнить команду make:

tar zxf mod_deflate-1.0.21.tar.gz
cd mod_deflate-1.0.21
./configure --with-apache=<apache_dir>
make
Команда make накладывает патчи на исходные тексты Apache и копирует mod_deflate.c в каталог <apache_dir>/src/modules/extra/. При сборке Apache модуль необходимо активировать:
cd <apache_dir>
./configure
    ...
    --activate-module=src/modules/extra/mod_deflate.o
    ...

Если у Вас не установлена библиотека zlib, то Вы можете скачать дистрибутив и статически её собрать:

tar zxf zlib-1.1.4.tar.gz
cd zlib-1.1.4
./configure
make
В этом случае при конфигурировании mod_deflate необходимо указать путь к этой библиотеке:
cd mod_deflate-1.0.21
./configure
    --with-apache=../apache-1.3.22
    --with-zlib=../zlib-1.1.4
make
Параметр --with-zlib появился в mod_deflate версии 1.0.10. До этого mod_deflate собирался с уже установленной библиотекой zlib.

При конфигурировании можно указать ещё два параметра:

  • --with-idle-check - проверять уровень загрузки процессора. Этот параметр доступен только на FreeBSD 3.x и выше.

  • --with-patch=<path_to_patch> - использовать указанную программу patch. Параметр появился в версии 1.0.10.

Как это работает

Для того, чтобы ответ был сжат, в запросе прежде всего должен быть заголовок "Accept-Encoding", в котором указан метод gzip или deflate. В середине 2002 года по обобщённым данным нескольких систем сбора статистики в Рунете около 90-93% всех запросов выполняется браузерами MSIE 4.x-6.x, понимающими gzip и deflate и около 5-7% - браузерами Netscape 4.x, понимающими gzip.

Кроме того, запрос не должен проходить через транзитные прокси-сервера, поскольку нельзя определённо сказать, умеют ли они корректно кэшировать сжатые ответы. Например, не умеющий правильно кэшировать сжатые ответы прокси-сервер может передать закэшированный в сжатом виде ответ клиенту, непонимающему подобное кодирование. Наличие прокси-серверов проверяется по заголовку "Via". С этим же связано ограничение на версию протокола HTTP - сжатие выполняется, только если версия запроса не ниже 1.1, так как только в этой версии прокси-сервер обязан устанавливать заголовок "Via". Для запроса версии 1.0 нельзя определённо утверждать, что запрос не проходил через прокси-сервера.

Существует ещё несколько условий для сжатия ответа:

  • ответ должен иметь тип "text/html",

  • код ответа должен быть равен 200 (HTTP_OK),

  • ответ не должен уже иметь заголовка "Content-Encoding",

  • и в запросе не должен запрашиваться только заголовок (HEAD).

Если все описанные выше условия соблюдены, то в ответ добавляется заголовок "Content-Encoding: gzip" или "Content-Encoding: deflate", а тело ответа сжимается указанным методом. Кроме того, в сжатом ответе удаляется заголовок "Content-Length", поскольку длина сжатого ответа неизвестна на момент передачи заголовков. В отсутствие заголовка "Content-Length" и при запросе версии HTTP/1.1 Apache передаёт ответ чанками (chunks) и добавляет заголовок "Transfer-Encoding: chunked". Необходимо заметить, что в этом случае соединение может находится в состоянии keep-alive после передачи ответа. Если же запрос версии 1.0, то при отсутствии заголовка "Content-Length" соединение закрывается сразу же после передачи ответа.

Некоторые рекомендации

Для того, чтобы ответы кодировались методом gzip достаточно одной директивы DeflateEnable on. Кроме того, из-за ошибки в MSIE 4.x рекомендуется использовать директиву DeflateDisableRange "MSIE 4."

При такой настройке сжатие будет выполняться только при условиях, описанных в предыдущем разделе. Однако ответы на запросы от Netscape 4.x сжиматься не будут, поскольку Netscape 4.x делает запросы версии 1.0. Поскольку сейчас около 90-93% запросов выполняется браузерами MSIE 4.x-6.x и около 5-7% - браузером Netscape 4.x, то часть из оставшихся 2-3% запросов может выполняться браузерами, которые не понимают gzip в качестве "Content-Encoding". Если эти запросы не представляют для Вас интереса, то можно добавить такие директивы

DeflateHTTP  1.0
DeflateProxied  on
и получить уменьшение исходящего трафика HTML-файлов в два-три раза, тогда как при настройках по умолчанию уменьшение не так заметно из-за того, что около трети всех запросов выполняется через прокси-сервера. Однако нужно заметить, что MSIE 5.5 и выше, работающие через прокси-сервер, как правило, не воспринимают сжатые запросы.

Кроме того, можно воспользоваться параметрами "nocachable" и "poor_cachable" директивы DeflateProxied, позволяющими сжимать ответы, для которых кэширование запрещено, или же прокси-сервера вряд ли будут их кэшировать.

Если же Вы всё же решили не сжимать запросы, проходящие через прокси-сервера, то можно разрешить сжатие для запросов версии 1.0:

DeflateHTTP  1.0
поскольку вероятность того, что прокси-сервер не укажет заголовок "Via" достаточно мала.

Директива DeflateVary on позволяет управлять кэшированием при прохождении ответа через прокси-сервера, по крайней мере, для самого распространённого из них — Squid. Однако в этом случае ранние версии MSIE будут кэшировать не все ответы. Подробнее об этом в разделе "Использование заголовка "Vary"".

С помощью директивы DeflateTypes можно разрешить кодирование для ответов с типом "text/plain". Если Вы разрешили кодирование для запросов версии 1.0, то не следует разрешать сжатие для типов "text/css" и "application/x-javascript", поскольку Netscape 4.x не понимает сжатые файлы этих типов.

Не рекомендуется использовать метод deflate по причинам, изложенным чуть ниже.

При возникновении проблем с тем или иным браузером, декларирующим понимание какого-либо метода, но непонимающим его на самом деле, в качестве временного решения рекомендуется использовать запрещающие переменные среды.

Что можно сжимать

Ниже перечислены некоторые типы, которые можно достаточно безопасно кодировать методом gzip или deflate:

  • text/html
    Воспринимается в сжатом виде всеми браузерами.
    Этот тип всегда сжимается модулем mod_deflate.

  • text/plain
    Воспринимается в сжатом виде всеми браузерами, кроме плагина Macromedia FlashPlayer 4.x-5.x.

    Как правило, именно этот тип имеют данные, которые FlashPlayer получает через браузер с помощью функции loadVariables(). Однако в сжатом виде FlashPlayer их не понимает. Но на самом деле, для него тип данных не имеет значения и поскольку эти данные имеют формат, как у типа "application/x-www-form-urlencoded", то можно устанавливать этот тип для этих запросов.

  • text/xml
    application/xml
    Воспринимаются в сжатом виде всеми браузерами, понимающими XML, кроме плагина Macromedia FlashPlayer 5.x.

    FlashPlayer не понимает сжатые файлы этого типа, полученные через браузер с помощью функции XML.load(). Но, как и в случае с "text/plain", для FlashPlayer тип данных не имеет значения.

  • text/css
    Воспринимается в сжатом виде всеми браузерами, кроме Netscape 4.x.

  • application/x-javascript
    Воспринимается в сжатом виде всеми браузерами, кроме Netscape 4.x.

  • application/x-shockwave-flash
    Воспринимается в сжатом виде всеми браузерами, имеющим соответствующий плагин, кроме Netscape 4.x под Windows. Однако сжатие файлов этого типа, возможно, не всегда эффективно, в частности если в них используются изображения в формате jpeg и музыка в формате mp3.

  • text/rtf
    application/msword
    application/vnd.ms-excel
    application/vnd.ms-powerpoint
    Воспринимаются в сжатом виде только MSIE 4.x-6.x.

Какие бывают методы кодирования

В описании протокола HTTP 1.1 (RFC 2616) описаны 4 метода кодирования - gzip, deflate, compress и identity. В описании протокола HTTP 1.0 (RFC 1945) описаны 2 метода кодирования - x-gzip и x-compress, являющихся предшественниками и полными аналогами методов gzip и compress. mod_deflate поддерживает только два метода кодирования - gzip и deflate и не поддерживает все остальные, в частности, метод x-gzip.

  • gzip
    Два метода кодирования, gzip и deflate, используют один и тот же метод сжатия данных - deflate (RFC 1951), реализуемый библиотекой zlib (RFC 1950). В методе gzip (RFC 1952) перед сжатым потоком добавляется 10-байтный заголовок. Кроме того, после сжатого потока добавляется контрольная сумма CRC32 и длина несжатых данных, в сумме занимающие 8 байт. Тело HTTP-ответа в этом случае такое же, как если бы оно было сжато программой gzip. Это самый распространённый метод - его понимают браузеры Netscape 4.x-7.x, Mozilla, MSIE 4.x-6.x, Opera 4.x-7.x и Lynx 2.6-2.8.x.

  • deflate
    С методом кодирования deflate дела обстоят сложнее. В описании протокола HTTP 1.1 (RFC 2616) deflate описан так:

    The "zlib" format defined in RFC 1950 in combination with the "deflate" compression mechanism described in RFC 1951.

    Что, по-видимому, должно означать, что перед сжатым потоком должно быть 2 байта заголовка zlib, а после сжатого потока - контрольная сумма Adler32 (4 байта). Однако в браузерах MSIE 4.x-6.x, Opera 4.x-7.x, Netscape 6.x-7.x и Mozilla метод deflate реализован иначе - он представляет из себя только сжатый поток без заголовка и контрольной суммы. Именно этот вариант реализован в модуле mod_deflate. Кроме того, известен один браузер, Konqueror 2.x-3.0.x, в котором метод deflate реализован с ошибками и, начиная с версии "Konqueror 2.1 post BETA >= 20010128", этот браузер просто не указывает метод deflate в заголовке "Accept-Encoding". Существование двух возможных реализаций и реализаций с ошибками делает ненадёжным использование метода deflate.

  • compress
    Этот метод кодирования используют метод сжатия данных, реализованный в программе compress, то есть, тело HTTP-ответа в этом случае такое же, как если бы оно было сжато этой программой. Этот метод понимают Lynx 2.6-2.8.x, Netscape 4.x-6.x и Mozilla.

  • identity
    Этот метод кодирования никак не изменяет тело HTTP-ответа.

Директивы


Директива DeflateCompLevel

syntax: DeflateCompLevel 1 .. 9
default: DeflateCompLevel 1
context: server config, virtual host, directory, .htaccess

Устанавливает определённый в библиотеке zlib уровень сжатия от 1 до 9. Хотя уровень 1 наименее ресурсоёмок, тем не менее, он, как правило, позволяет уменьшить объём передаваемых файлов HTML в 2-4 раза. Увеличение уровня сжатия до 9 обычно не даёт такого впечатляющего результата, тo есть, если, например, при уровне 1 данные сжимаются в 4 раза, то при уровне 9 они сожмутся лишь в 5 раз. Насколько сжимается тот или иной файл в зависимости от уровня сжатия, Вы можете проверить с помощью программы gzip, указав ей параметр от -1 до -9.

В библиотеке zlib определён ещё один уровень - 0 (store), при котором сжатие не выполняется, но в контексте протокола HTTP он не имеет смысла, поскольку всегда можно передавать данные, вообще не используя сжатие.


Директива DeflateDisableRange

syntax: DeflateDisableRange строка [строка ...]
default: нет
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.4 и выше

Задаёт строку, при нахождении которой в заголовке "User-Agent" запрещается передача части ответа (range) в случае, если ответ может быть кодирован методом gzip или deflate. Таких директив может быть несколько. Если ответ не может быть кодирован методом gzip или deflate, то части (range) для данного браузера не запрещаются.

До версии 1.0.8 в одной директиве можно указывать только одну строку.

Рекомендуется устанавливать такую директиву

DeflateDisableRange "MSIE 4."


Директива DeflateEnable

syntax: DeflateEnable on|off
default: DeflateEnable off
context: server config, virtual host, directory, .htaccess

Разрешает или запрещает кодирование методом gzip или deflate.


Директива DeflateHTTP

syntax: DeflateHTTP 1.0|1.1
default: DeflateHTTP 1.1
context: server config, virtual host, directory, .htaccess

Устанавливает минимальную версию протокола HTTP в запросе, при которой разрешается кодирование методом gzip или deflate.


Директива DeflateHash

syntax: DeflateHash 1|2|4|8|16|32|64|128
default: DeflateHash 64
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.17 и выше

Устанавливает размер хэшей в килобайтах, используемых при сжатии. Больший размер улучшает сжатие, однако увеличивает потребность в памяти. Подробнее об этом в разделе "Ресурсы: память и процессор".

Эта директива задаёт параметр memLevel функции deflateInit2() библиотеки zlib. Значение 128K соответствует memLevel, равному 9, 64K - 8 и т.д.

До версии 1.0.17 размер хэшей равен 128K, однако, начиная с версии 1.0.17, по умолчанию используется размер 64K. Такой же размер использует программа gzip.


Директива DeflateIdleCheck

syntax: DeflateIdleCheck число
default: DeflateIdleCheck 1
context: server config

Задаёт интервал проверки уровня загрузки процессора в секундах. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации.


Директива DeflateIgnoreFlush

syntax: DeflateIgnoreFlush on|off
default: DeflateIgnoreFlush off
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.15 и выше

Разрешает или запрещает игнорирование вызовов ap_bflush(). Игнорирование этих вызовов позволяет существенно улучшить сжатие ответов, выдаваемых, например, Chili!Soft ASP, который после каждого вывода даже нескольких байт вызывает ap_bflush().


Директива DeflateMaxProcesses

syntax: DeflateMaxProcesses число
default: DeflateMaxProcesses 0
context: server config
compatibility: mod_deflate 1.0.13 и выше

Задаёт максимальное число дочерних процессов Apache, при котором разрешается кодирование методом gzip или deflate. Дело в том, что библиотека zlib использует почти 250-400K памяти (подробнее об этом в разделе "Ресурсы: память и процессор"). Если процесс Apache, не сжимающий ответ, занимает около 500K физической памяти, то на компьютере с 512M памяти можно запустить около 900 процессов Apache. При большем количестве возможно начнётся активный свопинг. Однако, если часть процессов Apache сжимает ответ, то 512M уже не хватит для 900 процессов и свопинг начнётся раньше. Если нагрузка на сервер такова, что обычно с ней справляются 500 процессов Apache, то можно поставить ограничение на сжатие до 700 процессов. В этом случае при пиковых нагрузках, требующих для обработки 700-900 процессов, сжатия не будет.

Ноль означает неограниченное число процессов.


Директива DeflateMinIdle

syntax: DeflateMinIdle 0 .. 100
default: DeflateMinIdle 0
context: server config

Задаёт минимальный уровень бездействия процессора в процентах, при котором разрешается кодирование методом gzip или deflate. Эта директива доступна только на FreeBSD 3.x и выше при указании параметра --with-idle-check при конфигурации.


Директива DeflateMinLength

syntax: DeflateMinLength число
default: DeflateMinLength 0
context: server config, virtual host, directory, .htaccess

Устанавливает минимальный размер тела ответа в байтах, при котором разрешается кодирование методом gzip или deflate. Размер определяется из заголовка "Content-Length", если это заголовок отсутствует, то кодирование выполняется независимо от размера ответа.


Директива DeflateOrder

syntax: DeflateOrder метод [метод]
default: DeflateOrder gzip
context: server config, virtual host, directory, .htaccess

Задаёт приоритет при выборе метода кодирования. Например, директива "DeflateOrder deflate gzip" делает метод deflate более приоритетным, чем gzip. Этой же директивой можно устанавливать только один метод кодирования. По умолчанию используется только метод gzip, поскольку использование метода deflate на данный момент ненадёжно.


Директива DeflateProxied

syntax: DeflateProxied on|poor_cachable|nocachable|off
default: DeflateProxied off
context: server config, virtual host, directory, .htaccess

Разрешает или запрещает кодирование ответов методом gzip или deflate для проксированных запросов. Такие запросы определяются по наличию заголовка "Via".

Начиная с версии 1.0.16, с помощью параметров "nocachable" и "poor_cachable" можно более гибко настраивать сжатие ответов для проксированных запросов в зависимости от кэшируемости ответов.

Параметр "nocachable" разрешает сжатие ответа в случае, если ответ содержит заголовки, запрещающие кэширование. mod_deflate к таким относит заголовок "Expires", в котором указано прошедшее время, и заголовок "Cache-Control" со значением "no-cache". Эти заголовки традиционно используются для запрета кэширования и должны пониматься всеми прокси-серверами, претендующими на корректную работу.

Параметр "poor_cachable" разрешает сжатие не только для описанных выше некэшируемых ответов, но и для так называемых плохо кэшируемых ответов. К ним mod_deflate относит ответы с заголовком "Cache-Control" и значениями "no-store" и "private", которые могут не поддерживаться некоторыми прокси-серверами. Кроме того, плохо кэшируемыми ответами считаются ответы, не содержащие заголовки "Expires", "Cache-Control", "Last-Modified" и "ETag". Такие ответы, как правило, не кэшируются прокси-серверами.

Необходимо заметить, что инструкции вида <meta http-equiv="pragma" content="no-cache"> внутри HTML документа никак не влияют на mod_deflate.


Директива DeflateTypes

syntax: DeflateTypes [+|-]mime-type [[+|-]mime-type ...]
default: DeflateTypes text/html
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.8 и выше

Задаёт типы ответов, которые можно кодировать методом gzip или deflate. Символы "+" и "-" позволяют разрешать или запрещать типы ответов при наследовании конфигурации из предыдущей секции. Символ "+" использовать не обязательно. Запретить кодирование для ответов с типом "text/html" нельзя. Тип ответа должен быть указан точно, то есть, маски вида "text/*" не допускаются.

До версии 1.0.8 mod_deflate кодирует только ответы с типом "text/*".


Директива DeflateVary

syntax: DeflateVary on|off
default: DeflateVary off
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.13 и выше

Разрешает или запрещает выдачу заголовка "Vary: Accept-Encoding" в ответах, сжатых методом gzip или deflate.


Директива DeflateWindow

syntax: DeflateWindow 1|2|4|8|16|32
default: DeflateWindow 32
context: server config, virtual host, directory, .htaccess
compatibility: mod_deflate 1.0.17 и выше

Устанавливает размер окна в килобайтах, используемого при сжатии. Больший размер улучшает сжатие, однако увеличивает потребность в памяти. Подробнее об этом в разделе "Ресурсы: память и процессор". Если в ответе есть заголовок "Content-Length" и указанный в нём размер меньше заданного окна, то окно уменьшается до минимально возможного так, чтобы размер ответа не превышала размер окна минус 262 байта. Кроме того, во столько же раз уменьшается и размер хэшей, заданный директивой DeflateHash.

До версии 1.0.17 mod_deflate использует окно размером 32K.


Что можно записать в лог

Судить о том, был ли сжат тот или иной ответ, каким методом и насколько, можно с помощью заметок (notes):

  • defl_m - один символ, означающий метод кодирования - "d" - deflate, "g" - gzip. Кроме того, если проверяется загрузка процессора или число процессов, то возможно ещё одно значение "b" - blocked, означающее, что кодирование возможно, но запрещено из-за загрузки процессора или большого числа процессов.

  • defl_i - размер несжатого (input) ответа.

  • defl_o - размер сжатого (output) ответа. Необходимо заметь, число переданных байт (%b) по протоколу HTTP/1.1 будет больше, поскольку в %b учитывается служебная информация для кодирования чанками (chunks).

  • defl_r - число с точностью до двух знаков после запятой, показывающее степень (ratio) сжатия. Считается как defl_i / defl_o.

В логах заметки можно использовать в виде %{defl_r}n. Рекомендуется следующий вариант:

\"%{defl_m}n:%{defl_r}n\"

Переменные среды

Кодирование тем или иным методом можно запретить с помощью переменных среды "no_deflate" и "no_gzip", устанавливаемых директивами SetEnvIf, BrowserMatch и им подобным, например:

BrowserMatch   "Konqueror"         no_deflate
BrowserMatch   "rv:0.9.1) Gecko/"  no_gzip no_deflate
На самом деле, указывать именно эти строки не нужно, так как, начиная с версии 1.0.7, mod_deflate содержит их в коде.

Ресурсы: память и процессор

Память является критическим ресурсом в том случае, если необходимо использовать сотни процессов Apache. Apache без тяжёлых модулей типа mod_perl или php обычно требует около 200-300K физической памяти на каждый дочерний процесс. Так как zlib использует сравнимое количество памяти, то сжатие удваивает требования к общему количеству памяти.

Размер используемой zlib памяти зависит от двух параметров и вычисляется по следующей формуле:

4 * DeflateWindow + 2 * DeflateHash
Для версии 1.0.17 этот размер не регулировался и был равен 4 * 32K + 2 * 128K, то есть, 384K. Начиная с версии 1.0.17, по умолчанию используется память размером 4 * 32K + 2 * 64K, то есть, 256K. Естественно, меньший размер окна и хэшей ухудшают степень сжатия, однако, если используются небольшие уровни сжатия, то ухудшение незаметно.

Ещё один способ регулирования расхода памяти предоставляет директива DeflateMaxProcesses.

На FreeBSD 3.x и выше можно задавать минимальный уровень бездействия процессора в процентах, при котором разрешается кодирование методом gzip или deflate, однако практика показывает, что современные процессоры сжимают достаточно быстро (по крайней мере файлы до 100K) и особенной необходимости в этом ограничении нет.

Известные ошибки и особенности

  • mod_deflate не сжимает ответы, прошедшие через mod_proxy, поскольку mod_proxy для отдачи ответа клиенту не использует функцию ap_send_http_header(). В то же время, ответы mod_proxy, вставляемые с помощью mod_rewrite в SSI-документы, сжимаются.

  • Текст, выведенный с помощью функций ap_rprintf() и ap_vrprintf(), не перекодируется Russian Apache. Это связано с тем, что Russian Apache, обрабатывая эти функции, работает напрямую с BUFF вместо того, чтобы использовать функции ap_b*(), и портит сжатый поток. Поэтому для этих функций запрещается перекодирование. На самом деле, эта особенность не должна повлиять на что-либо, поскольку на данный момент функции ap_rprintf() и ap_vrprintf() не используются для вывода каких-либо текстов на русском языке. Функция ap_rprintf() активно используется в mod_status и mod_info, и незначительно в mod_include для вывода fsize, в mod_autoindex для вывода размеров иконок и в mod_jserv для вывода статуса.

  • mod_deflate не учитывает веса методов кодирования, указанных в заголовке "Accept-Encoding". Вместо этого приоритет методов задаётся посредством директивы DeflateOrder.

  • Поскольку для работы mod_deflate необходимо патчить тексты Apache, модуль должен быть статически слинкован с Apache.

  • Модуль, возможно, будет собираться на не-Unix платформах, но никаких телодвижений по портированию не делалось.

Браузеры, что они умеют

Ниже приводится список браузеров с указанием версии протокола и методов кодирования, указываемые в заголовке "Accept-Encoding". Для более или менее распространённых браузеров в скобках приводиться приблизительный процент их использования в середине 2002 года. Для некоторых браузеров даны комментарии о тех или иных ошибках или особенностях обработки сжатых запросов. Отсутствие комментария не означает, что ошибок нет, скорее о них пока не известно.

  • MSIE 4.x (4-5%), 5.x (65-70%) и 6.x (23-25%), кроме версий под Macintosh
    HTTP/1.1, "gzip, deflate"

    Версии под Macintosh не понимают кодирование методами gzip и deflate и не передают заголовок "Accept-Encoding".

    MSIE 5.5 и выше не передаёт заголовок "Accept-Encoding", если делает запрос по протоколу HTTP 1.0, например, при работе через прокси-сервер. Однако, если в этом случае от прокси-сервера будет получен сжатый ответ, то MSIE его не поймёт.

    MSIE 4.x кэширует принятые ответы в сжатом виде, поэтому если приём сжатого ответа прервать, а затем повторить снова, то MSIE делает запрос с прерванного места, указывая в заголовке "Range" смещение, равное длине полученного сжатого ответа. Если ему передать несжатый остаток, то MSIE считает, что весь ответ не сжат и показывает закэшированную часть в сжатом виде, а следом за ней вновь полученную часть. Как правильно передавать остаток в сжатом виде для MSIE 4.x, сказать сложно, проще запретить передачу по частям в таких случаях. Поэтому разумным компромиссом является директива DeflateDisableRange "MSIE 4."

    MSIE 4.x некорректно обрабатывает сжатый поток, если длина запрашиваемого URL без учёта префикса "http://" больше по-видимому 253 символов. В этом случае MSIE 4.x долго ждёт ответа от сервера, зависает или завершается с ошибкой. Поэтому, начиная с версии 1.0.7, mod_deflate запрещает кодирование методами gzip и deflate, если заголовок "User-Agent" содержит строку "MSIE 4" и длина строки запроса больше 200 символов.

  • Netscape 3.x, 4.0-4.05, версии под Unix и PowerPC Macintosh
    HTTP/1.0
    Netscape 3.x хотя и не передаёт заголовок "Accept-Encoding", но понимает метод x-gzip
    Netscape 4.0-4.05 хотя и не передаёт заголовок "Accept-Encoding", но понимает методы gzip и x-gzip

    Версии под Windows и 68K Macintosh не понимают кодирование методами gzip и x-gzip.

    Эти версии понимают сжатый ответ при условии, что он имеет тип "text/html" или "text/plain". Сжатые ответы с другими типами, обрабатываемые собственно Netscape, например, "application/x-javascript" или "text/css" (Netscape 4.x) не воспринимаются.

  • Netscape 4.06-4.08, 4.5-4.7x (3-5%)
    HTTP/1.0, "gzip"
    Эти версии также понимают методы x-gzip и x-compress.

    Как и предыдущие версии, эти браузеры понимают сжатый ответ при условии, что он имеет тип "text/html" или "text/plain". В то же время ответы, обрабатываемые плагинами, например, "application/x-shockwave-flash" (Macromedia FlashPlayer) воспринимаются версиями под Unix в сжатом виде.

    Версии Netscape 4.x под Windows кэшируют принятые ответы в сжатом виде, но не разжимают их при печати или предварительном просмотре перед печатью.

  • Mozilla m14-m18, 0.6-0.9.2, Netscape 6.0-6.1
    HTTP/1.1, "gzip,deflate,compress,identity"
    Эти версии также понимают методы x-gzip и x-compress.

    Версия Mozilla 0.9.1 (июнь 2001) и созданные на её основе Netscape 6.1b1, Galeon и SkipStone и не воспринимают заголовок "Content-Encoding" с пробелом в конце заголовка и показывают ответ в сжатом виде. Поэтому, начиная с версии 1.0.6, mod_deflate запрещает кодирование методами gzip и deflate, если заголовок "User-Agent" содержит строку "rv:0.9.1) Gecko/". Браузеры Galeon и SkipStone, созданные на основе этой версии, не содержат строку с версией Mozilla. Эти версии достаточно редкие, но если Вас интересует совместимость с ними, то можно указать следующие директивы

    BrowserMatch   "Galeon)"     no_gzip no_deflate
    BrowserMatch   "SkipStone)"  no_gzip no_deflate
    

  • Mozilla 0.9.3-1.4b, Netscape 6.2-7.0
    HTTP/1.1, "gzip, deflate, compress;q=0.9"
    Эти версии также понимают методы x-gzip и x-compress.

    Вышеописанное относится и к браузерам SkipStone, Galeon и Phoenix, созданным на основе Mozilla 0.9.3-1.4b.

  • Mozilla 1.4-1.x, Netscape 7.1
    HTTP/1.1, "gzip,deflate"
    Эти версии также понимают методы compress, x-gzip и x-compress.

    Вышеописанное относится и к браузерам Phoenix, Firebird и Firefox, созданным на основе Mozilla 1.4-1.x.

  • Opera 4.x-7.x
    HTTP/1.1, "deflate, gzip, x-gzip, identity, *;q=0"

  • Lynx 2.6-2.8.x
    HTTP/1.0, "gzip, compress"
    Эти версии также понимают методы x-gzip и x-compress.

  • Konqueror 2.0.x
    HTTP/1.1, "x-gzip; q=1.0, x-deflate, gzip; q=1.0, deflate, identity"

    Обработка метода gzip в Konqueror реализованa неэффективно - сжатый ответ записывается во временный файл, после чего файл открывается функцией gzdopen() и считывается функцией gzread(). Что касается метода deflate, то его реализация просто не работает. Создаётся впечатление, что разработчики не понимали то, что они писали - сначала сжатый ответ записывается во временный файл, затем он частями считывается (зачем вообще файл!?) и передаётся функции inflate(), что однако не приводит к желаемому результату, поскольку функция inflateInit2() не вызывается вообще.

    В связи с этим, начиная с версии 1.0.7, mod_deflate запрещает кодирование методом deflate, если заголовок "User-Agent" содержит строку "Konqueror".

  • Konqueror 2.1.x
    HTTP/1.1, "x-gzip; q=1.0, gzip; q=1.0, identity"

    Начиная с версии "Konqueror 2.1 post BETA >= 20010128", в заголовке "Accept-Encoding" не указывается deflate и x-deflate, но реализация осталась прежней.

  • Konqueror 2.2.x-3.0.x
    HTTP/1.1, "x-gzip, gzip, identity"

    В заголовке "Accept-Encoding" не указывается deflate и x-deflate, но реализация осталась прежней.

  • Konqueror 3.1
    HTTP/1.1, "x-gzip, x-deflate, gzip, deflate, identity"

    Реализация методов gzip и deflate полностью переписана.

  • Macromedia FlashPlayer 4.x

    Не понимает сжатые ответы, полученные через браузер с помощью функции loadVariables().

  • Macromedia FlashPlayer 5.x

    Не понимает сжатые ответы, полученные через браузер с помощью функций loadVariables() и XML.load().

Использование заголовка "Vary"

MSIE обрабатывает заголовок "Vary" достаточно своеобразно:

  • MSIE 4.x
    При получении ответа с заголовком "Vary" с любым содержимым MSIE 4.x кэширует такие ответы только при следующих условиях:

    • в ответе есть заголовок "Content-Encoding: gzip" или "Content-Encoding: deflate";
    • в запросе указан файл с расширением .html или .htm. Файлы с другими расширениями, например, .css, .shtml, .php и запросы, оканчивающиеся слешом, кэшироваться не будут.
    Необходимо также отметить, что при каждом обращении к закэшированному таким образом запросу MSIE 4.x тем не менее выполняет запрос на сервер с заголовком If-Modified-Since. Этого не наблюдается в случае закэшированных ответов без заголовка "Vary".

  • MSIE 5.0x
    При получении ответа с заголовком "Vary" с любым содержимым MSIE 5.0x кэширует такие ответы только при следующих условиях:

    • в ответе есть заголовок "Content-Encoding: gzip" или "Content-Encoding: deflate";
    • в запросе указан файл с кэшируемым расширением, например, .html, .htm или .php. К некэшируемым расширениями в данном случае относятся, например, .css и .shtml. Запросы, оканчивающиеся слешом, также кэшироваться не будут.

  • MSIE 5.5 и 6.x
    При получении ответа с заголовком "Vary" с любым содержимым MSIE 5.5 и 6.x кэширует такие ответы только, если в ответе есть заголовок "Content-Encoding: gzip" или "Content-Encoding: deflate".

Прокси-сервера

Около трети всех запросов выполняются через прокси-сервера. Ниже приводится список некоторых прокси-серверов. Для более или менее распространённых серверов в скобках указан приблизительный процент их использования на данный момент (2001 год).

  • Squid (около 70%)
    Не умеет правильно кэшировать сжатые ответы без заголовка "Vary". Squid 2.0-2.4 вообще не кэшируют ответы с заголовком "Vary". Squid 2.5 корректно кэширует сжатые ответы с заголовком "Vary".

  • MS Proxy 2.0
    Не умеет правильно кэшировать сжатые ответы без заголовка "Vary".

  • Oops (3%)
    Начиная с версии 1.5.0, для клиентов, непонимающих кодирование методом gzip, Oops отдаёт кэшированные сжатые ответы в разжатом виде.

(C) Игорь Сысоев
http://sysoev.ru