400 Bad Request - 重複ヘッダー

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します
info

症状

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

エラー メッセージ

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

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: Field Orderに従って 、ヘッダー フィールドのフィールド値全体がカンマ区切りのリスト(#(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. [分析] > [API Monitoring] > [調査] ページに移動します。
  4. エラーが発生した特定の期間を選択します。
  5. プロキシ フィルタが [すべて] に設定されていることを確認します。
  6. [障害コード] を [時間] に対してプロットします。
  7. 次のように、障害コード protocol.http.DuplicateHeader を含むセルを選択します。

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

  9. [ログを表示] をクリックして、失敗したリクエストの行を展開します。
  10. [ログ] ウィンドウで、次の詳細を確認します。
    1. ステータス コード: 400
    2. 障害ソース: apigee
    3. 障害コード: protocol.http.DuplicateHeader
  11. 障害ソース の値が apigee または MP で、障害コード の値が 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. X-Apigee-fault-code protocol.http.DuplicateHeader の値と一致する 400 エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。

    NGINX アクセスログからの 400 エラーのサンプル:

    NGINX アクセスログの上記のサンプル エントリには、X-Apigee- fault-code X-Apigee-fault-source: の次の値が含まれています。

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

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

診断

  1. 共通の診断手順で説明されているように、API Monitoring または NGINX アクセスログを使用して、確認されたエラーの障害コード障害ソース を特定します。
  2. 障害ソース の値が 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 には、クライアント アプリケーションとターゲット サーバーが重複するヘッダーを Apigee Edge の API プロキシに送信できるようにする CwC プロパティ HTTPHeader.<HeaderName> が用意されています。

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

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

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

仕様

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

仕様
RFC 7230、セクション 3.2.2: Field Order
RFC 7230、セクション 3.2: Header Fields

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