Apache2 mod_proxy оборачивает HTTP-заголовок вместо его пересылки

Apache2 mod_proxy оборачивает HTTP-заголовок вместо его пересылки

Обращаясь к серверу Oracle Apex через прокси-сервер Apache, я время от времени получаю следующий HTTP-пакет в качестве ответа от сервера:

Connection:Keep-Alive
Date:Fri, 20 Jan 2017 16:00:24 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.6 () PHP/5.4.16
Transfer-Encoding:chunked

0
HTTP/1.1 200 OK
Server: Oracle XML DB/Oracle Database
Content-Type: text/html; charset=utf-8
Content-Length: 33388

ACTUAL HTML PAGE FROM APEX

Я не знаю, откуда взялся 0. Хотя, похоже, что Proxy оборачивает полный HTTP-ответ, который он получает от APEX (включая HTTP-заголовок), как HTTP-тело в другой HTTP-пакет:

<Apache HTTP PACKAGE>
    <Apache HTTP HEADER>
        Connection:Keep-Alive
        Date:Fri, 20 Jan 2017 16:00:24 GMT
        Keep-Alive:timeout=5, max=100
        Server:Apache/2.4.6 () PHP/5.4.16
        Transfer-Encoding:chunked

    </Apache HTTP HEADER>
    <Apache HTTP BODY>
        0
        <APEX HTTP PACKAGE>
                HTTP/1.1 200 OK
                Server: Oracle XML DB/Oracle Database
                Content-Type: text/html; charset=utf-8
                Content-Length: 33388

                ACTUAL HTML PAGE FROM APEX
        </APEX HTTP PACKAGE>
    </Apache HTTP BODY>
</Apache HTTP PACKAGE>

Вместо этого прокси-сервер должен просто пересылать HTTP-пакет клиенту. Так что клиент получает HTTP-пакет, как будто он приходит от APEX, не зная, что он был переслан прокси-сервером. Это работает как и ожидалось в 29 из 30 случаев, но иногда это ведет себя так, как описано выше. Это ошибка в прокси-сервере? Не могли бы вы предложить возможное решение?

решение1

Это не упаковка, это из-за заголовка transfer-encoding: chunked. Смотретьhttps://en.wikipedia.org/wiki/Кодирование_передачи_фрагментов

0 — это сигнал последнего фрагмента. Из приведенной выше страницы:

Каждый фрагмент начинается с числа октетов встраиваемых данных, выраженных в виде шестнадцатеричного числа в ASCII, за которым следуют необязательные параметры (расширение фрагмента) и завершающая последовательность CRLF, за которой следуют данные фрагмента. Фрагмент завершается CRLF.

и

Завершающий фрагмент — это обычный фрагмент, за исключением того, что его длина равна нулю. За ним следует трейлер, который состоит из (возможно, пустой) последовательности полей заголовка сущности. Обычно такие поля заголовка отправляются в заголовке сообщения; однако может быть эффективнее определить их после обработки всей сущности сообщения. В этом случае полезно отправлять эти заголовки в трейлере.

Попробуйте SetEnv proxy-nokeepalive 1в конфигурации Apache mod_proxy. Или попробуйте

SetEnv proxy-sendcl 1

SetEnv proxy-sendchunked 0

Видетьhttp://httpd.apache.org/docs/2.4/mod/mod_proxy.html#request-bodiesдля объяснений.

Связанный контент