Назад | Перейти на главную страницу

Как отключить Transfer-Encoding: фрагменты в Apache с ответами HTTP / 1.1

У меня есть страница mod_include (SSI), которая генерирует ошибочный вывод во время фрагментированного кодирования по запросу браузера HTTP / 1.1.

Страница выводится нормально при запросе HTTP / 1.0 (поскольку вывод не разбивается на части).

Как я могу сказать Apache не использовать фрагментированное кодирование по запросу браузера HTTP / 1.1?

Больше информации: Ошибочные фрагментированные выходные данные вызваны включенной поддержкой sendfile () на машине Solaris 5.10 с процессором sparc. Отключение поддержки sendfile () приводит к исчезновению этой проблемы; однако я пытаюсь отловить эту ошибку и исправить ее.

Приведенный выше ответ неверен.

Если запрос - HTTP / 1.0, Apache никогда не буферизует ответ перед его отправкой (с заголовком Content-Length). Конечно, Apache может это сделать, но есть более элегантное решение, которое использует Apache: он отвечает заголовком «Connection: close» и закрывает соединение, как только отправляет все данные.

В соответствии с Спецификация HTTP, наличие заголовка «Соединение: закрыть» означает, что клиенту необходимо читать, пока соединение не будет закрыто.

Решение вашей проблемы - заставить Apache обрабатывать запрос как HTTP / 1.0, установив указанный даунгрейд-1.0 переменная окружения. Фрагментированное кодирование передачи - это функция HTTP / 1.1, и Apache не будет использовать ее для запросов HTTP / 1.0.

Например. вот как вы можете отключить фрагментированные ответы для файлов php:

++++++++++++
apache.conf
++++++++++++

<Files *.php>
    SetEnv downgrade-1.0
</Files>

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

Чтобы было ясно: HTTP / 1.0 управляет им, потому что Apache читает весь ответ перед его отправкой, поэтому он знает, насколько он будет большим. Это до смешного неэффективно и медленно, и, как ни странно, нет никакого способа включить эту логику для запросов HTTP / 1.1, кроме как принудить их к HTTP / 1.0 (что вы действительно, действительно не хотите делать, не так ли? , устанавливаемая переменная среды "даунгрейд-1.0")

Клиент Apache попытается определить размер отправляемого тела. Предварительная установка "Content-Length" вызовет ошибку, если вы не используете специальные перехватчики.

Он проверяет объект, который он будет отправлять, чтобы определить, разбит ли он на фрагменты или размер тела (content-length) <0, и если оба из них истинны, он использует заголовок «Transfer-Encoding = chunked». Если объект не предпочитает фрагменты и обнаружена длина содержимого> -1, то он использует заголовок Content-Length.

Обычно, если источником тела является часть тела mime, он будет использовать «Transfer-Encoding», потому что вызов метода size () возвращает -1, поэтому преобразование части тела mime в массив байтов будет работать, поскольку он вернет число байтов в массиве.

У меня были похожие проблемы. Решил проблему, убрав Transfer-encoding заголовок из ответа прямо в приложении.