Mod-Proxy
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,而不知道它是由代理轉發的。這在 30 次中有 29 次按預期工作,但有時它的行為如上所述。這是代理中的錯誤嗎?您能否建議一個可能的解決方法?
這不是包裝,這是由於
transfer-encoding: chunked
標題。見https://en.wikipedia.org/wiki/Chunked_transfer_encoding0 是最終塊的信號。從上面的頁面:
每個塊以它嵌入的數據的八位字節數開始,以 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 。