![Apache2 mod_proxy は HTTP ヘッダーを転送するのではなくラップします](https://rvso.com/image/697361/Apache2%20mod_proxy%20%E3%81%AF%20HTTP%20%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%83%A9%E3%83%83%E3%83%97%E3%81%97%E3%81%BE%E3%81%99.png)
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/チャンク転送エンコーディング
0 は最後のチャンクの信号です。上記のページから:
各チャンクは、埋め込まれたデータのオクテット数で始まります。この数は ASCII の 16 進数で表され、その後にオプションのパラメータ (チャンク拡張) と終了 CRLF シーケンスが続き、最後にチャンク データが続きます。チャンクは CRLF で終了します。
そして
終了チャンクは、長さが 0 である点を除いて、通常のチャンクです。その後に続くのは、エンティティ ヘッダー フィールドのシーケンス (空の場合もあります) で構成されるトレーラーです。通常、このようなヘッダー フィールドはメッセージのヘッダーで送信されますが、メッセージ エンティティ全体を処理した後にヘッダー フィールドを判別する方が効率的な場合があります。その場合、これらのヘッダーをトレーラーで送信すると便利です。
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#リクエストボディ説明のため。