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

ここに表示されているのは 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.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. ここに表示されるすべてのヘッダー(ConnectionHostExpires、およびDate 上記の例)は、この ドキュメントでは既存の構成を持つヘッダーと呼ばれます。

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

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

始める前に

このドキュメントの手順を使用する前に、 Private Cloud で Edge のプロパティを構成する方法を理解しておいてください。これは、 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. 次の形式で 1 行追加します。
    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 が更新されているかどうかを確認します。

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

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

    /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. プロパティが空白に設定されている場合、値が上書きされ、重複するヘッダーと複数の値が許可されないことを意味します。つまり、Apigee への HTTP リクエストまたは HTTP レスポンスの一部として、Expires ヘッダーを複数回送信することはできません。
    2. 特定のプロパティにヒットがない場合、値が上書きされていない ことを意味します。これは既存の構成 を持つヘッダーではありません。つまり、 特定のヘッダーを複数回送信できます(重複は許可されます)。 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 行をプロパティ ファイルに追加します。

    既存の構成

    シナリオ 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 Processors で上記の手順を繰り返します。

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

このセクションでは、特定のヘッダーのプロパティ 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)に http.propertiesの新しい値 {blank} が設定されています。これは、特定の HTTP ヘッダー Expires(および myheader)の重複と複数の値を許可する動作が Message Processor で正常に無効になっていることを示します。
  5. プロパティ HTTPHeader.Expires (or HTTPHeader.myheader) の古い値が表示される場合は、 ヘッダーの allowDuplicates と複数の値を構成する で説明されているすべての手順を正しく実行していることを確認してください。手順が抜けている場合は、すべての手順をもう一度正しく繰り返します。

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

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