![Apache2 mod_proxy encapsula o cabeçalho HTTP em vez de encaminhá-lo](https://rvso.com/image/697361/Apache2%20mod_proxy%20encapsula%20o%20cabe%C3%A7alho%20HTTP%20em%20vez%20de%20encaminh%C3%A1-lo.png)
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: chunked
cabeç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 1
na 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.