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 包轉送到客戶端。這樣客戶端就可以像來自 APEX 一樣接收 HTTP 包,而不知道它是由代理轉發的。 30 次中有 29 次按預期工作,但有時其行為如上所述。這是代理中的錯誤嗎?您能建議一個可能的解決方法嗎?

答案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以獲得解釋。

相關內容