ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
HTTP 仕様 RFC 7230 のセクション 3.2.2: Field Order に準拠して、Apigee Edge では、特定のヘッダーに例外があり、重複が許可されている場合を除き、クライアントからの HTTP リクエストまたはバックエンド サーバーからの HTTP レスポンスに、同じヘッダーが同じ値または異なる値で複数回渡されないようにする必要があります。
デフォルトでは、Apigee Edge では、ほとんどの HTTP ヘッダーに重複と複数の値を渡すことができます。ただし、 重複と複数の値が許可されていないヘッダーに記載されている特定のヘッダーは許可されません。 したがって、
- クライアントが特定のヘッダーを含む HTTP リクエストを複数回送信した場合、または Apigee Edge で重複や複数の値が許可されていない 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 の動作
次の表に、ヘッダーが重複して送信され、複数の値が指定された場合の Apigee Edge の動作を、Message Processor で HTTPHeader プロパティがどのように構成されているかに応じて示します。HTTPHeader の例は test-header です。
| リクエスト | conf/http.properties+HTTPHeader.test-header=[ の値に基づく送信 HEADERS | |||
|---|---|---|---|---|
| <空白> | allowDuplicates | multiValued | allowDuplicates, multiValued(デフォルト) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
内部的には、
その後、 |
内部的には、
ただし、元の形式はターゲットに送信されます。 |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
始める前に
このドキュメントの手順を使用する前に、 Private Cloud で Edge のプロパティを構成する方法を理解しておいてください。これは、 Edge を構成する方法で説明されています。
ヘッダーの allowDuplicates と複数の値を構成する
重複と
複数の値を許可する HTTP ヘッダー プロパティで説明されているように、プロパティ HTTPHeader.ANY = allowDuplicates,
multiValued の値は、
Apigee Edge で重複と複数の値を指定できることを意味します。ただし、プロパティ HTTPHeader.HEADER_NAME を使用して、重複するヘッダーや複数の値を許可しないように、値を明示的に上書きするヘッダーもあります。
このセクションでは、Edge を構成する方法で説明されている構文に従って、対応するトークンを使用して、Message Processor 上の 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
- 次の形式で 1 行追加します。
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 が更新されているかどうかを確認します。
Message Processor で値を更新するためにトークン conf_http_HTTPHeader.Expires を使用する場合でも、実際のプロパティ HTTPHeader.Expires
に新しい値が設定されているかどうかを確認する必要があります。
- Message Processor マシンで、
HTTPHeader.HEADER_NAMEディレクトリでプロパティ/opt/apigee/edge-message-processor/confを検索し、 次の図のように新しい値が設定されているかどうかを確認します。grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
たとえば、プロパティ
HTTPHeader.Expiresに新しい値が設定されていることを確認するには、次のコマンドを実行します。grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
HTTPHeader.HEADER_NAMEMessage Processor に新しい値が正常に設定されると、上記のコマンドは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ヘッダーを複数回送信することはできません。 - 特定のプロパティにヒットがない場合、値が上書きされていない ことを意味します。これは既存の構成 を持つヘッダーではありません。つまり、 特定のヘッダーを複数回送信できます(重複は許可されます)。 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 行をプロパティ ファイルに追加します。
既存の構成
シナリオ 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 Processors で上記の手順を繰り返します。
ヘッダーが重複と複数の値を許可しないように構成されていることを確認する
このセクションでは、特定のヘッダーのプロパティ
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_NAMEI に新しい 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)にhttp.propertiesの新しい値 {blank}が設定されています。これは、特定の HTTP ヘッダーExpires(およびmyheader)の重複と複数の値を許可する動作が Message Processor で正常に無効になっていることを示します。 プロパティ
HTTPHeader.Expires (or HTTPHeader.myheader)の古い値が表示される場合は、 ヘッダーの allowDuplicates と複数の値を構成する で説明されているすべての手順を正しく実行していることを確認してください。手順が抜けている場合は、すべての手順をもう一度正しく繰り返します。プロキシが想定どおりに動作していることを確認します。特に、プロキシでヘッダーを取得して設定する機能ロジック がある場合は確認してください。
- プロパティを変更できない場合は、Apigee Edge サポートにお問い合わせください。