現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください。 情報
HTTP 仕様の RFC 7230、セクション 3.2.2: フィールドの順序に従い、Apigee Edge は、クライアントからの HTTP リクエストまたはバックエンド サーバーからの HTTP レスポンスに同じまたは異なる値で複数回渡される同じヘッダーが含まれないと想定しています(特定のヘッダーに例外があり、重複が許容される場合を除く)。
デフォルトでは、Apigee Edge は大部分の HTTP ヘッダーに重複する値と複数の値を渡すことができます。ただし、重複および複数の値を持つことが許可されていないヘッダーに記載されている特定のヘッダーは使用できません。したがって、次のようになります。
- クライアントが、特定のヘッダーを持つ HTTP リクエストを複数回送信した場合、または Apigee Edge で重複/複数の値が許可されていない HTTP ヘッダーに複数の値を持つ HTTP リクエストを送信すると、エラーコード
protocol.http.DuplicateHeader
とともに400 Bad Request
が返されます。 - 同様に、バックエンド サーバーが特定のヘッダーを含む HTTP レスポンスを複数回送信した場合、または Apigee Edge で重複または複数の値が許可されていない HTTP ヘッダーに複数の値を含む HTTP レスポンスを送信した場合、エラーコード
protocol.http.DuplicateHeader
を含む502 Bad Gateway
が返されます。
これらのエラーに対処するための推奨される解決策は、重複したヘッダーを送信しないようにクライアント アプリケーションとバックエンド サーバーを修正し、以下のトラブルシューティング ハンドブックの RFC 7230、セクション 3.2.2: フィールドの順序を遵守することです。
ただし、例外を追加して、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, allowDuplicate.
で構成されているためです。
構成が上書きされました
一部の特定のヘッダーは、次のいずれかの方法でデフォルト構成が上書きされます。
HTTPHeader.HEADER_NAME=multivalued, allowDuplicate
この構成では、デフォルトの動作は変更されません。つまり、特定のヘッダーに重複および複数の値を含めることが許可されます。
.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= の値に基づく送信 HEADERS | |||
---|---|---|---|---|
<空白> | allowDuplicate | multiValued | allowDuplicate、multiValued(DEFAULT) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
Google 内部では、
|
内部的には、
元のフォームがターゲットに送信されます |
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 の構成方法で説明されている構文に従って対応するトークンを使用し、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
- 次の形式の行を追加します。
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
上記のコマンドの出力は、次のいずれかになります。
- このプロパティが空白に設定されている場合は、値が NOT に上書きされ、重複したヘッダーと複数の値を許可することを意味します。つまり、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」のプロパティが上書きされない ことも意味します。 - このプロパティが空白に設定されている場合は、値が NOT に上書きされ、重複したヘッダーと複数の値を許可することを意味します。つまり、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 で上記の手順を繰り返します。
ヘッダーが重複および複数の値を許可しないように構成されていることを確認する
このセクションでは、Message Processor での重複が許可されないように、特定のヘッダーのプロパティ HTTPHeader.HEADER_NAME
が正常に更新されていることを確認する方法について説明します。
ヘッダーの例として 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 で新しい HTTP ヘッダー値
HTTPHeader.HEADER_NAME
I が正常に設定されると、上記のコマンドによってhttp.properties
ファイルに新しい値が表示されます。 allowDuplicates
を無効にした後の上記のコマンドの結果は次のとおりです。既存の構成
シナリオ 1: 有効期限ヘッダー(既存の構成を含むヘッダー)
/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}
でhttp.properties
に設定されています。これは、特定の HTTP ヘッダーExpires
(およびmyheader
)について、重複や複数の値を許可する動作が Message Processor で正常に無効にされていることを示します。 プロパティ
HTTPHeader.Expires (or HTTPHeader.myheader)
に古い値が引き続き表示される場合は、allowDuplicates とヘッダーの複数の値の構成で説明されているすべてのステップに正しく従っていることを確認してください。ステップを見逃した場合は、すべてのステップを正しく繰り返します。プロキシが想定どおりに動作することを確認します。特に、プロキシのヘッダーを取得して設定するための機能ロジックがある場合は、確認します。
- それでもプロパティを変更できない場合は、Apigee Edge サポートに連絡してください。