У меня есть страница 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
заголовок из ответа прямо в приложении.