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

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. Хотя кажется, что прокси-сервер обертывает полный 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 раз, но иногда ведет себя так, как описано выше. Это ошибка прокси? Не могли бы вы предложить возможное решение?

Это не упаковка, это связано с transfer-encoding: chunked заголовок. Видеть https://en.wikipedia.org/wiki/Chunked_transfer_encoding

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 для объяснений.