Страница 1 из 1

Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Вс сен 04, 2016 8:25 pm
ijkl
На сервере Apache включен mod_deflate.

1. Когда с помощью php отправляется html страница и посылается заголовок ETag -- сервер отдает сжатый gzip файл, но без ETag. При этом Content-Length правильный и mod_deflate добавляет Vary: Accept-Encoding.

2. Когда с помощью php отправляется сформированный на лету файл прикладного типа и посылается заголовок Content-Length, сервер отдает сжатый gzip файл, но без Content-Length. При этом mod_deflate добавляет Transfer-Encoding: chunked и Vary: Accept-Encoding. Это при том, что статичные файлы отдаются с правильным Content-Length.

3. Когда с помощью php отправляется сформированный на лету файл прикладного типа частями (в ответ на запрос с Range) и посылается заголовок 206 Partial content, а также Content-Range и Content-Length -- сервер вообще ничего не сжимает. Это при том, что запрошенные части статичного контента отправляются сжатыми, с правильными Content-Range и Content-Length.

Без mod_deflate все работает корректно.

Последняя проблема не критичная, вряд ли часто будут запрашивать контент частями. Но вот первые две проблемы серьезные. Можно ли или их решить или придется отключать mod_deflate для этих типов контента?

Re: Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Вс сен 04, 2016 9:11 pm
Mikanoshi
Сгенерировать заголовок ETag самому в PHP. Но не проще поставить Nginx перед апачем, а в апаче всё отключить?)
Content-Length не должен быть в заголовке, если Transfer-Encoding: chunked, это по спецификации. А вот если в PHP скрипте задать верный Content-Length, то апач по-идее не должен использовать chunked.
Можно ещё форсировать HTTP/1.0, что-то типа этого:
Код: выделить все
SetEnv downgrade-1.0 1
SetEnv force-response-1.0 1

Re: Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Вс сен 04, 2016 9:22 pm
ijkl
Mikanoshi писал(а):Content-Length не должен быть в заголовке, если Transfer-Encoding: chunked
chunked добавляет mod_deflate. Мне не нужен chunked. Нужно Transfer-Encoding: gzip и Content-Length, как это происходит с другими статичными файлами, а также с text/html, который отдает php. Не понятно, почему, если php отдает text/html, но все нормально, а если файл, то chunked.

Mikanoshi писал(а):А вот если в PHP скрипте задать верный Content-Length, то апач по-идее не должен использовать chunked.
А если Content-Encoding: gzip, то Content-Length показывает размер сжатого файла?
Файл имеет размер 5715. Это же значение мой скрипт формирует и отправляет в Content-Length. Но я попробовал сохранить файл и запросить с сервера как статический. Сервер его сжал и в Content-Length: 1634.

Re: Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Пн сен 05, 2016 12:07 pm
Mikanoshi
Размер должен быть сжатого, наверно и сжимать тогда самому надо)
А если просто увеличить буфер? Chunked включается если в него не влезает сжатый файл.
http://httpd.apache.org/docs/2.2/mod/mo ... buffersize

Re: Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Ср сен 14, 2016 9:57 pm
ijkl
Проблема была в том, что php-скрипте буфер принудительно отправлялся до завершения скрипта. Но теперь снова проблема возникла, когда размер вывода слишком большой.

Mikanoshi писал(а):Размер должен быть сжатого, наверно и сжимать тогда самому надо)
А если просто увеличить буфер? Chunked включается если в него не влезает сжатый файл.
http://httpd.apache.org/docs/2.2/mod/mo ... buffersize

DeflateBufferSize 8096 Сколько можно ставить? С единицей измерения поймет 1M?

Re: Модуль mod_deflate удаляет ETag и Content-Length

СообщениеДобавлено: Ср сен 14, 2016 10:23 pm
Mikanoshi
Написано в байтах надо. Ставить сколько нужно, чтобы отправляемый файл влез) Файлы же не по ГБ?