透過 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以獲得解釋。