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

0
задан 20 January 2017 в 18:34
1 ответ

Это не упаковка, это связано с заголовком 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 для объяснений.

0
ответ дан 5 December 2019 в 08:43

Теги

Похожие вопросы