400 Bad Request - 重複ヘッダー

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

内容

クライアント アプリケーションが、API 呼び出しのレスポンスとして、HTTP ステータス コード 400 Bad Request とエラーコード protocol.http.DuplicateHeader を受け取ります。

エラー メッセージ

クライアント アプリケーションが次のレスポンス コードを受け取ります。

HTTP/1.1 400 Bad Request

また、以下のようなエラー メッセージが表示される場合もあります。

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

考えられる原因

このエラーは、Apigee Edge で重複の使用が許可されていない特定の HTTP ヘッダーが、クライアントから Apigee Edge に送信される HTTP リクエストの一部として、同じ値または異なる値で複数回表示される場合に発生します。

RFC 7230 のセクション 3.2.2: フィールドの順序 に従い、送信者は、そのヘッダー フィールドのフィールド値全体がカンマ区切りのリストとして定義されている場合を除き、メッセージ内で同じフィールド名を持つ複数のヘッダー フィールドを生成してはなりません。#(values)] などのヘッダー フィールドは既知の例外です。Apigee Edge は、クライアントが送信した HTTP リクエスト で重複が認められない特定のヘッダーを複数回検出すると、400 Bad Request とエラーコード protocol.http.DuplicateHeader を返します。

このエラーには、次のような原因が考えられます。

原因 説明 トラブルシューティングの実施対象
リクエストのヘッダーが重複しています クライアント アプリケーションから Apigee への HTTP リクエストに重複するヘッダーが含まれています。 Edge Public Cloud ユーザーと Private Cloud ユーザー

共通の診断手順

このエラーを診断するには、次のいずれかのツールや手法を使用します。

API Monitoring

API Monitoring を使用してエラーを診断するには:

  1. 適切なロールを持つユーザーとして Apigee Edge UI にログインします。
  2. 問題を調査する組織に切り替えます。

  3. [Analyze] > [API Monitoring] > [Investigate] ページに移動します。
  4. エラーが発生した期間を選択します。
  5. [プロキシ フィルタ] が [すべて] に設定されていることを確認します。
  6. [Time] に [Fault Code] をプロットします。
  7. 次のように、障害コード protocol.http.DuplicateHeader を含むセルを選択します。

  8. 障害コード protocol.http.DuplicateHeader に関する情報が次のように表示されます。

  9. [ログを表示] をクリックし、失敗したリクエストの行を開きます。
  10. [ログ] ウィンドウで、次の詳細をメモします。
    1. ステータス コード: 400
    2. 障害ソース: apigee
    3. 障害コード: protocol.http.DuplicateHeader
  11. [Fault Source] の値が apigee または MP で、[Fault Code] の値が protocol.http.DuplicateHeader の場合、クライアントからの HTTP リクエストに重複するヘッダーが含まれていることを示します。

Trace ツール

NGINX

NGINX アクセスログを使用してエラーを診断するには:

  1. Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、HTTP 400 エラーに関する重要な情報を特定できます。
  2. NGINX のアクセスログを確認します。

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ここで: ORGENVPORT# は実際の値に置き換えられます。

  3. 特定の期間に 400 エラーがあったかどうか(問題が過去に発生していた場合)、または 400 で失敗しているリクエストがあるかどうかを検索します。
  4. protocol.http.DuplicateHeader の値と一致する X-Apigee-fault-code400 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    NGINX のアクセスログの 400 エラーの例:

    上記の NGINX アクセスログのエントリ例では、X-Apigee- fault-codeX-Apigee-fault-source に次の値が入っています。

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

原因: リクエスト内のヘッダーが重複している

診断

  1. 一般的な診断手順で説明されているように、API Monitoring または NGINX アクセスログを使用して確認されたエラーの障害コード障害ソースを特定します。
  2. [Fault Source] の値が apigee または MP の場合、クライアント アプリケーションから Apigee に送信されるリクエストに重複するヘッダーが含まれていることを示します。
  3. リクエストの一部として複数回送信される実際のヘッダーを確認するには、次のいずれかの方法を使用します。

    エラー メッセージ

    エラー メッセージを使用する

    1. Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、faultstring を参照してください。faultstring には、複数回送信されたヘッダー名が含まれます。

      エラー メッセージの例:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 上記のエラー メッセージでは、faultstring にように、ヘッダー Expires が複数回送信されていることがわかります。

    実際のリクエスト

    実際のリクエストを使用する

    1. クライアント アプリケーションによって行われた実際のリクエストにアクセスできる場合は、次の操作を行います。

      1. リクエストで渡されたヘッダーのリストを確認します。
      2. リクエストに、特定のヘッダーが同じ値または異なる値で複数回含まれている場合、それがこのエラーの原因です。

      リクエストの例:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      上のリクエスト例では、ヘッダー Expires が複数回送信されます。このため、リクエストは 400 Bad Request エラーとエラーコード protocol.http.DuplicateHeader で失敗します。

    2. また、クライアント ログにアクセスできる場合は、Apigee Edge に対して行われた実際のリクエストに関する情報を持っているかどうかを確認し、複数回送信されるヘッダーを特定できます。

解像度

重複を修正する

方法 1 [推奨オプション] 重複するヘッダーが含まれないようにクライアント アプリケーションを修正する

  1. 特定のクライアントが重複するヘッダーを送信する理由を分析します。たとえば、上記の例では Expires です。API プロキシが重複するヘッダーを受け入れても問題ないことを確認します。一般的に、これは HTTP 仕様の RFC7230 に即しているようには望ましくありません。
  2. これが望ましくない場合は、重複するヘッダーを送信しないようにクライアント アプリケーションを変更します。

    上記の例では、ヘッダー Expires が同じ値で 2 回送信されていますが、これは望ましくありません。この問題を解決するには、次のように Expires ヘッダーを 1 回だけ渡します。

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. この方法が必須で、ヘッダーの重複を許可する場合は、オプション 2: CwC プロパティの使用に進みます。

CwC

方法 2: CwC プロパティを使用する

Apigee が提供する CwC プロパティ HTTPHeader.<HeaderName> を使用すると、クライアント アプリケーションとターゲット サーバーは、重複するヘッダーを Apigee Edge の API プロキシに送信できます。

CwC プロパティ
HTTPHeader.<HeaderName> allowDuplicates,multivalued

たとえば、Message Processor で次のプロパティを設定すると、ヘッダー Expires の重複と複数の値を許可できます。

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud ユーザーの場合、 重複ヘッダーを使用するように Message Processor を構成するの入門ガイドを使用して、リクエストに重複したヘッダーが含まれている場合でも、Apigee Edge が 400 Bad Request エラーを発生させないようにプロパティを構成できます。
  2. Public Cloud ユーザーの場合は、Apigee Edge サポートに連絡して、組織用にこのプロパティを構成するよう依頼してください。

仕様

Apigee では、次の RFC 仕様に従って、クライアント アプリケーションがリクエストの一部として重複するヘッダーを送信しないことが想定されています。

仕様
RFC 7230 のセクション 3.2.2: フィールドの順序
RFC 7230、セクション 3.2(ヘッダー フィールド)

Apigee サポートのサポートが必要な場合は、診断情報の収集が必要な場合をご覧ください。

診断情報の収集が必要な場合

次の診断情報を収集して、Apigee Edge サポートに連絡してください。

Public Cloud ユーザーの場合は、次の情報を入力します。

  • 組織の名前
  • 環境名
  • API プロキシ名
  • 400 エラーを再現するための完全な curl コマンド
  • API リクエストのトレース ファイル

Private Cloud ユーザーの場合は、次の情報を入力します。

  • 失敗したリクエストについて確認された完全なエラー メッセージ
  • 環境名
  • API プロキシ バンドル
  • 400 エラーの再現に使用した curl コマンドを完了します。
  • API リクエストのトレース ファイル
  • NGINX アクセスログ:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    ここでORGENVPORT# は実際の値に置き換えられます。

  • Message Processor のシステムログ /opt/apigee/var/log/edge-message-processor/logs/system.log