Apache2 mod_proxy encapsula o cabeçalho HTTP em vez de encaminhá-lo

Apache2 mod_proxy encapsula o cabeçalho HTTP em vez de encaminhá-lo

Acessando um servidor Oracle Apex por meio de um proxy Apache, esporadicamente recebo o seguinte pacote HTTP como resposta do servidor:

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

Não sei de onde vem o 0. Embora pareça que o proxy agrupa a resposta HTTP completa obtida do APEX (incluindo o cabeçalho HTTP) como um corpo HTTP em outro pacote 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>

Em vez disso, o proxy deve simplesmente encaminhar o pacote HTTP para o cliente. Para que o cliente receba o Pacote HTTP como se fosse do APEX sem saber que foi encaminhado pelo Proxy. Isso funciona conforme o esperado 29 em 30 vezes, mas às vezes se comporta conforme descrito acima. Isso é um bug no proxy? Você poderia sugerir uma possível solução alternativa?

Responder1

Isto não é um embrulho, é devido ao transfer-encoding: chunkedcabeçalho. Verhttps://en.wikipedia.org/wiki/Chunked_transfer_encoding

O 0 é o sinal do pedaço final. Da página acima:

Cada pedaço começa com o número de octetos dos dados que ele incorpora, expresso como um número hexadecimal em ASCII seguido por parâmetros opcionais (extensão do pedaço) e uma sequência CRLF final, seguida pelos dados do pedaço. O pedaço é finalizado por CRLF.

e

O pedaço final é um pedaço regular, com a exceção de que seu comprimento é zero. Ele é seguido pelo trailer, que consiste em uma sequência (possivelmente vazia) de campos de cabeçalho de entidade. Normalmente, tais campos de cabeçalho seriam enviados no cabeçalho da mensagem; entretanto, pode ser mais eficiente determiná-los após processar toda a entidade da mensagem. Nesse caso, é útil enviar esses cabeçalhos no trailer.

Experimente SetEnv proxy-nokeepalive 1na sua configuração mod_proxy do Apache. Ou tente

SetEnv proxy-sendcl 1

SetEnv proxy-sendchunked 0

Verhttp://httpd.apache.org/docs/2.4/mod/mod_proxy.html#request-bodiespara explicações.

informação relacionada