現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動。 情報
HTTP 仕様 RFC 7230、セクション 3.2.2: Field Order に従い、Apigee Edge では、クライアントからの HTTP リクエストまたはバックエンド サーバーからの HTTP レスポンスに、特定のヘッダーに例外があり、重複が許可されている場合を除き、同じヘッダーが同じ値または異なる値で複数回渡されないことを想定しています。
デフォルトでは、Apigee Edge はほとんどの HTTP ヘッダーに重複と複数の値を渡すことを許可しています。ただし、重複と複数の値が許可されないヘッダーに記載されている特定のヘッダーは使用できません。したがって、次のようになります。
- クライアントが特定のヘッダーを含む HTTP リクエストを複数回送信した場合、または Apigee Edge で重複または複数の値が許可されていない HTTP ヘッダーに複数の値を指定して HTTP リクエストを送信した場合は、エラーコード
protocol.http.DuplicateHeader
の400 Bad Request
が返されます。 - 同様に、バックエンド サーバーが特定のヘッダーを含む HTTP レスポンスを複数回送信した場合、または Apigee Edge で重複または複数の値が許可されていない HTTP ヘッダーに複数の値が含まれている場合は、エラーコード
protocol.http.DuplicateHeader
で502 Bad Gateway
が返されます。
これらのエラーに対処するための推奨される解決策は、重複するヘッダーを送信しないようにクライアント アプリケーションとバックエンド サーバーを修正し、次のトラブルシューティング ハンドブックで説明されている仕様 RFC 7230、セクション 3.2.2: Field Order に準拠することです。
ただし、例外を追加して、一部の HTTP ヘッダーに重複や複数の値を含めたい場合もあります。このような場合は、Message Processor レベルでプロパティ HTTPHeader.HEADER_NAME
を設定することで、特定の HTTP ヘッダーに対して重複するヘッダーと複数の値を許可できます。
このドキュメントでは、このプロパティに関する情報、上記のエラーを回避するためにこのプロパティを有効にする方法、およびこのプロパティに関するベスト プラクティスについて説明します。
重複と複数の値を許可する HTTP ヘッダー プロパティ
Apigee Edge には、HTTP ヘッダーの重複と複数の値を許可する動作を制御する次の 2 つのプロパティがあります。これらの設定は、Edge の構成方法で説明されているトークン構文を使用して、Message Processor でのみ構成できます。
プロパティ名 | 説明 | 使用できる値 |
---|---|---|
HTTPHeader.ANY |
このプロパティは、クライアントが行った HTTP リクエストの一部として送信されたカスタム ヘッダーや、バックエンド サーバーから Apigee Edge に送信された HTTP レスポンスなど、すべての HTTP ヘッダーで重複または複数の値が許可されるかどうかを示します。 デフォルト値:
|
|
|
このプロパティは、特定のヘッダーの動作を |
同上。 |
重複や複数の値を持つことができないヘッダー
前述のように、Apigee Edge では、ほとんどの HTTP ヘッダーで重複と複数の値がデフォルトで許可されています。これは、プロパティ HTTPHeader.ANY
が値 multiValued, allowDuplicates.
で構成されているためです。
設定が上書きされました
特定のヘッダーでは、次のいずれかの方法でデフォルト構成が上書きされます。
HTTPHeader.HEADER_NAME=multiValued, allowDuplicates
この構成では、デフォルトの動作は変更されません。つまり、特定のヘッダーは重複や複数の値を持つことができます。
.HTTPHeader.HEADER_NAME=
この設定により、デフォルトの動作が変更されます。つまり、特定のヘッダーに重複や複数の値を指定することはできません。
重複や複数の値を含めることが許可されないヘッダーの特定
このセクションでは、次のものを特定する方法について説明します。
- Apigee Edge Private Cloud の設定で重複と複数の値が許可されない 特定のヘッダー。
- 既存の構成を持つ特定のヘッダー
Message Processor マシンで、次のように
/opt/apigee/edge-message-processor/conf
ディレクトリでプロパティHTTPHeader.
を検索します。grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
出力例:
# grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued … <snipped> /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires= /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates … <snipped>
- 構成の上書きセクションで説明したように、上記のサンプル出力で次の情報に注意してください。
- HTTP ヘッダー
Connection
は上書きされますが、重複と複数の値を持つことは許容されます - HTTP ヘッダー
Host
とExpires
は 上書きされ、重複と複数の値は許可されません - HTTP ヘッダー
Date
は上書きされ、重複は許可されますが、複数の値は許可されません - ここで説明するヘッダー(上記の例の
Connection
、Host
、Expires
、Date
)はすべて、このドキュメントでは既存の構成を持つヘッダーと呼ばれます。
- HTTP ヘッダー
Apigee Edge の動作
次の表では、ヘッダーが重複として送信され、Message Processor での HTTPHeader
プロパティの構成方法に応じて複数の値が送信された場合の Apigee Edge の動作を、HTTPHeader
の例を test-header
としています。
リクエスト | conf/http.properties+HTTPHeader.test-header= の値に基づく送信ヘッダー | |||
---|---|---|---|---|
<空白> | allowDuplicates | multiValued | allowDuplicates、複数値(デフォルト) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
社内では、
|
内部的には、
が、元のフォームがターゲットに送信されます。 |
test‑header=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
始める前に
このドキュメントの手順を使用する前に、 Edge の構成方法で説明されている、Private Cloud 上の Edge のプロパティの構成を理解してください。
ヘッダーの allowDuplicates と複数の値の構成
重複と複数の値を許可する HTTP ヘッダー プロパティで説明されているように、プロパティ HTTPHeader.ANY = allowDuplicates,
multiValued
の値は、Apigee Edge ですべてのヘッダーに重複と複数の値が許可されることを意味します。ただし、プロパティ HTTPHeader.HEADER_NAME
を使用して重複するヘッダーや複数の値を許可しないように、値が明示的に上書きされるヘッダーもあります。
このセクションでは、Edge の構成方法で説明されている構文に従って対応するトークンを使用して、メッセージ プロセッサでこのような HTTP ヘッダーの重複と複数の値を許可するように、プロパティ HTTPHeader.HEADER_NAME
を構成する方法について説明します。
このセクションでは、以下で説明するように、重複と複数の値を許可するヘッダーの例として Expires
(と myheader
)を使用します。
- プロパティ
HTTPHeaderHEADER_NAME
の 現在の値を特定し、次のコマンドを使用して、重複と複数の値を許可するようにまだ有効になっていないことを確認します。grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
たとえば、
Expires
ヘッダーのプロパティを設定する場合は、Message Processor のプロパティHTTPHeader.Expires
トークンの現在の値を確認します。grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
上記のコマンドの出力は次のいずれかになります。
- プロパティが空白に設定されている場合、値が上書きされ(既存の構成を持つヘッダーである)、重複するヘッダーと複数の値が許可されないことを意味します。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として、
Expires
ヘッダーを複数回送信することはできません。 - 特定のプロパティにヒットがない場合は、値が上書きされていないことを意味します(これは既存の設定を含むヘッダーではありません)。つまり、Apigee Edge への HTTP リクエストまたは HTTP レスポンスの一部として、特定のヘッダーを複数回送信できます(重複は許可されます)。
- このプロパティに値
allowDuplicates, multiValued
が設定されると、値は明示的に上書き されます(これは既存の構成を含むヘッダーです)。つまり、特定のヘッダーは、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として複数回送信できます(重複が許可されます)。
検索コマンドの出力例:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
上記の出力例は、プロパティ
HTTPHeader.Expires
が空白に設定されていることを示しています。つまり、このプロパティは上書きされ、ヘッダーExpires
の重複または複数の値が許可されなくなります。 - プロパティが空白に設定されている場合、値が上書きされ(既存の構成を持つヘッダーである)、重複するヘッダーと複数の値が許可されないことを意味します。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として、
- 上記の出力例のように、特定のヘッダーに対応するプロパティが明示的に上書きされ、重複または複数の値が許可されないことが判明した場合にのみ、次の手順を実施します。明示的に上書きされていない場合は、このセクションの残りの手順をスキップしてください。
- 編集] をタップします。存在しない場合は、作成できます。
/opt/apigee/customer/application/message-processor.properties
たとえば、vi を使用してファイルを開くには、次のように入力します。
vi /opt/apigee/customer/application/message-processor.properties
- 次の形式の行を追加します。
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- 変更を保存します。
プロパティ ファイルの所有者が
apigee
ユーザーであることを確認します。ない場合は、次のコマンドを実行します。chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
Message Processor を再起動します。
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
トラフィックに影響を与えずに再起動するには、 トラフィックに影響を与えずに Message Processor をローリング再起動するをご覧ください。
- 複数の Message Processor がある場合は、すべての Message Processor で上記の手順を繰り返します。
重複と複数の値が設定されているヘッダーを確認する
このセクションでは、特定のヘッダーのプロパティ HTTPHeader.HEADER_NAME
が正常に更新され、Message Processor で重複が許容されたことを確認する方法について説明します。
ヘッダーの例として Expires
を使用し、対応するプロパティ HTTPHeader.Expires
が更新されたかどうかを確認します。
トークン conf_http_HTTPHeader.Expires
を使用して Message Processor の値を更新しても、実際のプロパティ HTTPHeader.Expires
が新しい値で設定されているかどうかを確認する必要があります。
- Message Processor マシンで、
/opt/apigee/edge-message-processor/conf
ディレクトリでプロパティHTTPHeader.HEADER_NAME
を検索し、次のように新しい値で設定されているかどうかを確認します。grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
たとえば、プロパティ
HTTPHeader.Expires
が新しい値で設定されていることを確認するには、次のコマンドを実行します。grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
- Message Processor で
HTTPHeader.HEADER_NAME
に新しい値が正常に設定されると、上記のコマンドによりhttp.properties
ファイルに新しい値が表示されます。 allowDuplicates
とmultiValued
を構成した後の上記のコマンドのサンプル結果は次のとおりです。/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- 上記の出力例では、
HTTPHeader.Expires
プロパティがhttp.properties
の新しい値allowDuplicates, multiValued
に設定されています。これは、HTTPHeader
で重複と複数の値を許可する動作が Message Processor で正常に構成されていることを示します。 - プロパティ
HTTPHeader.HEADER_NAME
に古い値が引き続き表示される場合は、ヘッダーに allowDuplicates と複数の値を構成するに記載されているすべての手順が正しく行われていることを確認してください。手順を省略した場合は、すべての手順を正しく繰り返します。プロキシが期待どおりに動作していることを確認します。特に、プロキシでヘッダーを取得して設定する機能ロジックがある場合はなおさらです。
- それでもプロパティを変更できない場合は、Apigee Edge サポートにお問い合わせください。
ヘッダーの allowDuplicates を無効にする
このセクションでは、Edge の構成方法で説明されている構文に従って、Message Processor の特定の HTTP ヘッダーで重複や複数の値を許可しないようにプロパティ HTTPHeader.{Headername}
を構成する方法について説明します。
このセクションでは、重複を許可しないヘッダーの例として Expires
(および myheader
)を使用します。
- 次のコマンドを使用して、プロパティ
HTTPHeaderHEADER_NAME
の 現在の値を確認し、重複と複数の値を許可するためにすでに無効になっていないことを確認します。grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
たとえば、
Expires
ヘッダーのプロパティを設定する場合は、Message Processor でHTTPHeader.Expires
トークンのプロパティの現在の値を確認します。grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
上記のコマンドの出力は次のいずれかになります。
- プロパティが空白に設定されている場合、値は重複するヘッダーと複数の値を許可しないように上書きされています。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として
Expires
ヘッダーを複数回送信することはできません。 - 特定のプロパティにヒットがない場合は、値が上書きされていないことを意味し、これは既存の構成を持つ NOT ヘッダーです。つまり、特定のヘッダーは、Apigee Edge への HTTP リクエストまたは HTTP レスポンスの一部として複数回送信できます(重複が許可されます)。
- プロパティが
allowDuplicates, multiValued
の値で設定されている場合、その値は明示的に上書きされ、既存の構成であることを意味します。ただし、これは、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として、特定のヘッダーを複数回送信できることを意味します(重複は許可されます)。
出力例 #1
検索コマンドの出力例 1:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
出力例から、プロパティ
HTTPHeader.Expires
がallowDuplicates, multiValued
に設定されていることがわかります。つまり、ヘッダーExpires
のプロパティが上書きされ、重複または複数の値が許可されるということです。出力例 2
コマンドの例と検索コマンドの出力 #2
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
出力例には出力が表示されません。これは、プロパティ
HTTPHeader.myheader
がデフォルトでallowDuplicates, multiValued
に設定されていることを意味します。これは、ヘッダー myheader のプロパティが上書きされない ことも意味します。 - プロパティが空白に設定されている場合、値は重複するヘッダーと複数の値を許可しないように上書きされています。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として
- 次のいずれかの場合は、このセクションの残りの手順を実施します。
- 特定のヘッダーに対応するプロパティは、上記の出力例 #1 のように、重複と複数の値を許可するために上書きされます(既存の構成を含むヘッダー)
- 上記の出力サンプル 2 のように、特定のヘッダーに対応するプロパティにヒットがない(既存の構成を含むヘッダーではない)
それ以外の場合は、このセクションの残りの手順をスキップします。
- 次のファイルを編集します。存在しない場合は作成できます。
/opt/apigee/customer/application/message-processor.properties
たとえば、vi を使用してファイルを開くには、次のように入力します。
vi /opt/apigee/customer/application/message-processor.properties
- プロパティ ファイルに次の形式の行を追加します。
既存の構成
シナリオ 1: 既存の構成を含むヘッダー:
conf_http_HTTPHeader.Expires=
既存の構成はありません
シナリオ 2: 既存の構成を持つヘッダーではない:
conf/http.properties+HTTPHeader.myheader=
- 変更を保存します。
- プロパティ ファイルの所有者が
apigee
ユーザーであることを確認します。実行されていない場合は、次のコマンドを実行します。chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- Message Processor を再起動します。
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
トラフィックに影響を与えずに再起動するには、 トラフィックに影響を与えずに Message Processor をローリング再起動するをご覧ください。
- 複数の Message Processor がある場合は、すべての Message Processor で上記の手順を繰り返します。
重複と複数の値を許可しないようにヘッダーが構成されていることを確認する
このセクションでは、特定のヘッダーのプロパティ HTTPHeader.HEADER_NAME
が正常に更新され、Message Processor での重複が許容されないようにする方法について説明します。
ヘッダーの例として Expires
(と myheader
)を使用し、対応するプロパティ HTTPHeader.Expires
(と HTTPHeader.myheader
)が更新されているかどうかを確認します。
Message Processor マシンで、
/opt/apigee/edge-message- processor/conf
ディレクトリでプロパティHTTPHeader.HEADER_NAME
を検索し、次のように新しい値で設定されているかどうかを確認します。grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
たとえば、プロパティ
HTTPHeader.Expires
が新しい値に設定されていることを確認するには、次のコマンドを実行します。既存の構成
grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
既存の構成はありません
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
- Message Processor で
HTTPHeader.HEADER_NAME
I に新しい HTTP ヘッダー値が正常に設定されると、上記のコマンドによりhttp.properties
ファイルに新しい値が表示されます。 allowDuplicates
を無効にした後の上記のコマンドのサンプル結果は次のとおりです。既存の構成
シナリオ 1: Expires ヘッダー(既存の設定を含むヘッダー)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
既存の構成なし
シナリオ 2: myheader ヘッダー(既存の構成を含むヘッダーではない)
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
- 上記の出力例では、プロパティ
HTTPHeader.Expires
(およびHTTPHeader.myheader
)に新しい値 {blank}
inhttp.properties
} が設定されています。これは、特定の HTTP ヘッダーExpires
(およびmyheader
)の重複と複数の値を許可する動作が Message Processor で正常に無効にされたことを示します。 プロパティ
HTTPHeader.Expires (or HTTPHeader.myheader)
に古い値が表示される場合は、ヘッダーの allowDuplicates と複数の値の構成に記載されている手順をすべて正しく実施していることを確認します。手順を省略した場合は、すべての手順を正しく繰り返します。プロキシが想定どおりに機能していることを確認します。特に、プロキシでヘッダーを取得して設定する機能ロジックがある場合は注意してください。
- それでもプロパティを変更できない場合は、Apigee Edge サポートにお問い合わせください。