Mod-Proxy

Apache2 mod_proxy 包裝 HTTP 標頭而不是轉發它

  • March 23, 2017

通過 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,而不知道它是由代理轉發的。這在 30 次中有 29 次按預期工作,但有時它的行為如上所述。這是代理中的錯誤嗎?您能否建議一個可能的解決方法?

這不是包裝,這是由於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 。

引用自:https://serverfault.com/questions/827588