ヘッダーの重複を許可するように Message Processor を構成する

現在、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 ヘッダーに重複値または複数の値が許可されるかどうかを示します。

デフォルト値:

multivalued, allowDuplicate,

  1. blank: HTTP ヘッダーに重複や複数の値を指定することはできません。
  2. multiValued: 複数の値を持つヘッダーを複数のヘッダーに分割します。HTTP ヘッダーには複数の値を使用できますが、重複は許可されません。値 multiValued は有効になっています。これは、test-header=a,btest-header=atest-header=b. に変換されることを意味します。
  3. allowDuplicate: 同じ名前の複数の(重複する)HTTP ヘッダーを許可します。
  4. multivalued, allowDuplicate: HTTP ヘッダーでは、複数の値と重複の両方が許可されます。

HTTPHeader.HEADER_NAME

このプロパティは、特定のヘッダーの動作を HTTPHeader.ANY の指定内容からオーバーライドするために使用します。

同上。

重複および複数の値を持つことが許可されていないヘッダー

前述のように、Apigee Edge では、ほとんどの HTTP ヘッダーで重複と複数の値がデフォルトで許可されます。これは、プロパティ HTTPHeader.ANY が値 multivalued, allowDuplicate. で構成されているためです。

構成が上書きされました

一部の特定のヘッダーは、次のいずれかの方法でデフォルト構成が上書きされます。

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    この構成では、デフォルトの動作は変更されません。つまり、特定のヘッダーに重複および複数の値を含めることが許可されます。

    .
  • HTTPHeader.HEADER_NAME=

    この設定では、デフォルトの動作が変更されています。つまり、特定のヘッダーに重複した複数の値を使用することはできません。

重複および複数の値を持つことが許可されていないヘッダーを判別する

このセクションでは、次の情報を特定する方法について説明します。

  • Apigee Edge Private Cloud の設定で、重複および複数の値の使用が許可されていない ヘッダー
  • 既存の構成の特定のヘッダー
  1. 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>
    
  2. 構成が上書きされるセクションで説明したように、上記のサンプル出力にある次の点に注意してください。
    1. HTTP ヘッダー Connection は上書きされるが、重複した複数の値を持つことが許容される
    2. HTTP ヘッダー HostExpires は上書きされ、重複した値と複数の値を含めることはできません。
    3. HTTP ヘッダー Date が上書きされ、重複は許可されますが、複数の値は指定できません。
    4. ここに表示されるすべてのヘッダー(上記のサンプルの ConnectionHostExpiresDate)は、このドキュメントでは既存の構成でヘッダーと呼んでいます。

Apigee Edge の動作

次の表に、Message Processor で HTTPHeader プロパティがどのように構成されているかに応じて、ヘッダーが重複して送信された場合と、複数の値で送信された Apigee Edge の動作を示します。HTTPHeadertest-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

protocol.http.
DuplicateHeader

Google 内部では、test-header=a,b を次の要素に分割しました。

  • test-header=a、および
  • test-header=b,

DuplicateHeader エラーがスローされます。

test‑header=a,b

内部的には、test-header=a,b を次のとおりに分割しました。

  • test-header=a、および
  • test-header=b,

元のフォームがターゲットに送信されます

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
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)を使用します。

  1. 次のコマンドを使用して、プロパティ 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
    

    上記のコマンドの出力は、次のいずれかになります。

    1. このプロパティが空白に設定されている場合は、値が上書きされる(これは既存の構成のヘッダーです)ため、ヘッダーと複数の値の重複は許可されません。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として Expires ヘッダーを複数回送信することはできません。
    2. 特定のプロパティにヒットがない場合、値は上書きされません既存の設定を含むヘッダーではありません)。つまり、Apigee Edge への HTTP リクエストまたは HTTP レスポンスの一部として、特定のヘッダーを複数回送信できます(重複は可能です)。
    3. このプロパティに値 allowDuplicates, multivalued を設定すると、値は明示的に上書き されます(これは既存の構成を含むヘッダーです)。Apigee への HTTP リクエストまたは HTTP レスポンスの一部として、特定のヘッダーを複数回送信できます(重複は可能です)。

    検索コマンドの出力例:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    上記の出力例は、プロパティ HTTPHeader.Expires が空白に設定されていることを示しています。つまり、ヘッダー Expires でプロパティが上書きされ、重複した値や複数の値が許可されないことになります。

  2. 上の出力例のように、特定のヘッダーに対応するプロパティが明示的に上書きされるために、重複値または複数の値を許可しない場合、その場合にのみ、次の手順を実施します。明示的に上書きされていない場合は、このセクションの残りの手順をスキップしてください。
  3. 編集存在しない場合は、次の方法で作成できます。
    /opt/apigee/customer/application/message-processor.properties
    

    たとえば、vi を使用してファイルを開くには、次のように入力します。

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. 次の形式の行を追加します。
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. 変更を保存します。
  6. プロパティ ファイルの所有者を apigee ユーザーにします。存在しない場合は、次のコマンドを実行します。

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Message Processor を再起動します。

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    トラフィックに影響を与えずに再起動するには、 トラフィックに影響を与えずに Message Processor のローリング再起動を実行するをご覧ください。

  8. 複数の Message Processor がある場合は、すべての Message Processor で上記の手順を繰り返します。

ヘッダーが重複および複数の値を持つように構成されていることを確認する

このセクションでは、特定のヘッダーのプロパティ HTTPHeader.HEADER_NAME が正常に更新され、Message Processor での重複を許可されていることを確認する方法について説明します。

ヘッダーの例として Expires を使用し、対応するプロパティ HTTPHeader.Expires が更新されているかどうかを確認します。

トークン conf_http_HTTPHeader.Expires を使用して Message Processor の値を更新する場合でも、実際のプロパティ HTTPHeader.Expires が新しい値で設定されていることを確認する必要があります。

  1. 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
    
  2. Message Processor で HTTPHeader.HEADER_NAME に新しい値が正常に設定されると、上記のコマンドによって http.properties ファイルに新しい値が表示されます。
  3. allowDuplicatesmultiValued を構成した後の上記のコマンドのサンプル結果は次のとおりです。

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. 上記の出力例では、プロパティ HTTPHeader.Expireshttp.properties の新しい値 allowDuplicates, multiValued で設定されています。これは、HTTPHeader での重複と複数値を許可する動作が、Message Processor で正常に構成されていることを示します。
  5. プロパティ HTTPHeader.HEADER_NAME に古い値が引き続き表示される場合は、allowDuplicates とヘッダーの複数の値の構成で説明されているすべてのステップに正しく従っていることを確認してください。ステップを見逃した場合は、すべてのステップをもう一度正しくやり直します。

    プロキシが想定どおりに動作することを確認します。特に、プロキシのヘッダーを取得して設定するための機能ロジックがある場合は、確認してください。

  6. それでもプロパティを変更できない場合は、Apigee Edge サポートにお問い合わせください。

ヘッダーの allowDuplicates の無効化

このセクションでは、Edge の構成方法で説明されている構文に従って対応するトークンを使用し、Message Processor の特定の HTTP ヘッダーで重複や複数値を許可しないようにプロパティ HTTPHeader.{Headername} を構成する方法について説明します。

このセクションでは、以下で説明するように、重複を許容しないヘッダーの例として Expires(および myheader)を使用します。

  1. 次のコマンドを使用して、プロパティ 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
    

    上記のコマンドの出力は、次のいずれかになります。

    1. このプロパティが空白に設定されている場合は、値が NOT に上書きされ、重複したヘッダーと複数の値を許可することを意味します。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として Expires ヘッダーを複数回送信することはできません。
    2. 特定のプロパティにヒットがない場合、値は上書きされません。これは、既存の設定の NOT ヘッダーです。Apigee Edge への HTTP リクエストまたは HTTP レスポンスの一部として、特定のヘッダーを複数回送信できます(重複は可能です)。
    3. このプロパティに値 allowDuplicates, multivalued を設定すると、値は明示的に上書きされ、これは既存の構成であることを意味します。ただし、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として特定のヘッダーを複数回送信できます(重複は可能です)。

    出力例 1

    検索コマンドの出力例 1:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    

    このサンプル出力は、プロパティ HTTPHeader.ExpiresallowDuplicates, multiValued に設定されていることを示しています。つまり、ヘッダー Expires のプロパティが重複または複数の値を許可するように上書きされます。

    出力例 2

    検索コマンドのサンプル コマンドと出力 2

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    この出力例には出力はありません。これは、HTTPHeader.myheader プロパティがデフォルトで allowDuplicates, multiValued に設定されていることを示しています。また、これはヘッダー「myheader」のプロパティが上書きされない ことも意味します。

  2. 次のいずれかに該当する場合は、このセクションの残りの手順を行います。
    1. 特定のヘッダーに対応するプロパティは、上記の出力例 1既存の構成を含むヘッダー)のように重複および複数の値を許可するために上書きされる
    2. 上記の出力例 2 にあるように、特定のヘッダーに対応するプロパティにヒットがない(既存の設定を含むヘッダーではない)

    それ以外の場合は、このセクションの残りの手順をスキップします。

  3. 次のファイルを編集します。存在しない場合は、作成できます。
    /opt/apigee/customer/application/message-processor.properties
    

    たとえば、vi を使用してファイルを開くには、次のように入力します。

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. プロパティ ファイルに次の形式の行を追加します。

    既存の構成

    シナリオ 1: 既存の構成のヘッダー:

    conf_http_HTTPHeader.Expires=
    

    既存の設定はありません

    シナリオ 2: 既存の構成のヘッダーではない場合:

    conf/http.properties+HTTPHeader.myheader=
    
  5. 変更を保存します。
  6. プロパティ ファイルの所有者を apigee ユーザーにします。設定されていない場合は、次のコマンドを実行します。
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. Message Processor を再起動します。
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    トラフィックに影響を与えずに再起動するには、 トラフィックに影響を与えずに Message Processor のローリング再起動を実行するをご覧ください。

  8. 複数の Message Processor がある場合は、すべての Message Processor で上記の手順を繰り返します。

ヘッダーが重複および複数の値を許可しないように構成されていることを確認する

このセクションでは、Message Processor での重複が許可されないように、特定のヘッダーのプロパティ HTTPHeader.HEADER_NAME が正常に更新されていることを確認する方法について説明します。

ヘッダーの例として Expires(および myheader)を使用し、対応するプロパティ HTTPHeader.Expires(および HTTPHeader.myheader)が更新されているかどうかを確認します。

  1. 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
    
  2. Message Processor で新しい HTTP ヘッダー値 HTTPHeader.HEADER_NAME I が正常に設定されると、上記のコマンドによって http.properties ファイルに新しい値が表示されます。
  3. allowDuplicates を無効にした後の上記のコマンドの結果は次のとおりです。

    既存の構成

    シナリオ 1: 有効期限ヘッダー既存の構成を含むヘッダー

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    既存の設定はありません

    シナリオ 2: myheader ヘッダー(既存の構成のヘッダーではない)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. 上記の出力例では、プロパティ HTTPHeader.Expires(および HTTPHeader.myheader)が新しい値 {blank}http.properties に設定されています。これは、特定の HTTP ヘッダー Expires(および myheader)について、重複や複数の値を許可する動作が Message Processor で正常に無効にされていることを示します。
  5. プロパティ HTTPHeader.Expires (or HTTPHeader.myheader) に古い値が引き続き表示される場合は、allowDuplicates とヘッダーの複数の値の構成で説明されているすべてのステップに正しく従っていることを確認してください。ステップを見逃した場合は、すべてのステップを正しく繰り返します。

    プロキシが想定どおりに動作することを確認します。特に、プロキシのヘッダーを取得して設定するための機能ロジックがある場合は、確認します。

  6. それでもプロパティを変更できない場合は、Apigee Edge サポートに連絡してください。