Apache2 mod_proxy는 HTTP 헤더를 전달하는 대신 래핑합니다.

Apache2 mod_proxy는 HTTP 헤더를 전달하는 대신 래핑합니다.

Apache 프록시를 통해 oracle apex 서버에 액세스할 때 간헐적으로 서버로부터 응답으로 다음 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이 어디서 나오는지 모르겠습니다. 프록시는 APEX(HTTP 헤더 포함)에서 얻은 전체 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에서 오는 것처럼 HTTP 패키지를 수신합니다. 이는 30번 중 29번은 예상대로 작동하지만 때로는 위에서 설명한 대로 작동합니다. 이것은 프록시의 버그입니까? 가능한 해결 방법을 제안해 주시겠습니까?

답변1

이것은 포장이 아니며 헤더 때문입니다 transfer-encoding: chunked. 보다https://en.wikipedia.org/wiki/Chunked_transfer_encoding

0은 마지막 청크의 신호입니다. 위 페이지에서:

각 청크는 ASCII의 16진수로 표현된 포함된 데이터의 옥텟 수로 시작하고 그 뒤에 선택적 매개변수(청크 확장)와 종결 CRLF 시퀀스, 청크 데이터가 옵니다. 청크는 CRLF에 의해 종료됩니다.

그리고

종료 청크는 길이가 0이라는 점을 제외하면 일반 청크입니다. 그 뒤에는 엔터티 헤더 필드의 (비어 있을 수도 있는) 시퀀스로 구성된 트레일러가 옵니다. 일반적으로 이러한 헤더 필드는 메시지 헤더에 전송됩니다. 그러나 전체 메시지 엔터티를 처리한 후에 이를 결정하는 것이 더 효율적일 수 있습니다. 이 경우 해당 헤더를 예고편으로 보내는 것이 유용합니다.

SetEnv proxy-nokeepalive 1Apache mod_proxy 구성을 사용해 보십시오 . 아니면 시도해 보세요

SetEnv proxy-sendcl 1

SetEnv proxy-sendchunked 0

보다http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#request-bodies설명을 위해.

관련 정보