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

現在、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.DuplicateHeader400 Bad Request が返されます。
  • 同様に、バックエンド サーバーが特定のヘッダーを含む HTTP レスポンスを複数回送信した場合、または Apigee Edge で重複または複数の値が許可されていない HTTP ヘッダーに複数の値が含まれている場合は、エラーコード protocol.http.DuplicateHeader502 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 ヘッダーで重複または複数の値が許可されるかどうかを示します。

デフォルト値:

multiValued, allowDuplicates,

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

HTTPHeader.HEADER_NAME

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

同上。

重複や複数の値を持つことができないヘッダー

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

設定が上書きされました

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

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    この構成では、デフォルトの動作は変更されません。つまり、特定のヘッダーは重複や複数の値を持つことができます

    .
  • 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 の動作を、HTTPHeader の例を test-header としています。

リクエスト conf/http.properties+HTTPHeader.test-header= の値に基づく送信ヘッダー
<空白> allowDuplicates multiValued allowDuplicates、複数値(デフォルト)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

社内では、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 の構成方法で説明されている構文に従って対応するトークンを使用して、メッセージ プロセッサでこのような 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.Expires プロパティが http.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. プロパティが空白に設定されている場合、値は重複するヘッダーと複数の値を許可しないように上書きされています。つまり、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 で上記の手順を繰り返します。

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

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

ヘッダーの例として 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 で HTTPHeader.HEADER_NAME I に新しい HTTP ヘッダー値が正常に設定されると、上記のコマンドにより http.properties ファイルに新しい値が表示されます。
  3. 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=
  4. 上記の出力例では、プロパティ HTTPHeader.Expires(および HTTPHeader.myheader)に新しい値 {blank} in http.properties} が設定されています。これは、特定の HTTP ヘッダー Expires(および myheader)の重複と複数の値を許可する動作が Message Processor で正常に無効にされたことを示します。
  5. プロパティ HTTPHeader.Expires (or HTTPHeader.myheader) に古い値が表示される場合は、ヘッダーの allowDuplicates と複数の値の構成に記載されている手順をすべて正しく実施していることを確認します。手順を省略した場合は、すべての手順を正しく繰り返します。

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

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