2010-12-27 5 views
3

При использовании mod_deflate в Apache2 Apache будет загружать содержимое gzipped, устанавливая заголовок Transfer-encoding: chunked. Хотя это приводит к более быстрому времени загрузки, я не могу отобразить индикатор выполнения.Предотвращение переполнения Apache gzipped

Если я сам обрабатываю сжатие в PHP, я могу полностью его перенести и установить заголовок Content-length, чтобы я мог отображать индикатор выполнения для пользователя.

Есть ли какие-либо настройки, которые изменили бы поведение Apache по умолчанию, а Apache установил заголовок Content-length вместо того, чтобы перехватывать ответ, так что мне не нужно самостоятельно обрабатывать сжатие?

ответ

1

Возможно, вы можете сыграть с sendBufferSize, чтобы получить значение, достаточно большое, чтобы содержать ответ в одном куске.

Тогда chunked content является частью/1.1 протокола HTTP, можно заставить HTTP/1.0 ответа (так не Chunked: «сервер НЕ ДОЛЖЕН посылать трансфер-кодировок в/клиента с HTTP 1.0»), установив force-response-1.0 в вашей конфигурации apache. Но PHP нарушает эти настройки, это давняя ошибка PHP, есть workaround.

Мы могли бы попытаться изменить запрос на стороне клиента с заголовком, препятствующим блочное содержанием, но w3c говорит: «Все HTTP/1.1 приложение должны быть в состоянии принимать и декодировать„фрагментированные“кодирование передачи» , поэтому я не думаю, что есть такой заголовок, как «Принять», и такой, который может помешать серверу перерезать контент. Тем не менее, вы можете попытаться установить свой запрос в HTTP/1.0, это не является заголовком запроса, это первая строка, возможно, с jQuery.

Последнее, что HTTP/1.0 не хватает одной большой вещи, заголовки «host» не являются обязательными, убедитесь, что ваши запросы в HTTP/1.0 все еще используют заголовок «host», если вы работаете с виртуальными хостами на основе имени.

Редактировать: с помощью техники, указанной в обходном пути, вы можете увидеть, что вы можете настроить Apache env в PHP-коде. Это можно использовать для принудительного использования режима 1.0 только для вашего специального gzipped-контента, и вы должны использовать его, чтобы предотвратить заполнение приложения в HTTP/1.0 (или использовать режим запроса для установки HTTP/1.0 для ваших запросов gzip).

+0

Спасибо, но все это звучит более сложно, чем просто обработка сжатия в PHP. – yclevine

+0

Вы пытались принудительно настроить заголовок заголовка содержимого на ответном блоке? О сложности я не думаю, используя простой «apache_setenv (« force-response-1.0 »,« true »); на вашем PHP-скрипте, который делает ваш контент для будущего gzipped сложным, но это зависит от вас :-) – regilero

+0

Контент-кодирование и кодирование передачи не могут использоваться вместе. Что касается сложности, я просто имел в виду, что в этом случае я могу обрабатывать сжатие в PHP. – yclevine

Смежные вопросы