400 Bad Request - 重複ヘッダー

<ph type="x-smartling-placeholder"></ph> 現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント
詳細

症状

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

エラー メッセージ

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

HTTP/1.1 400 Bad Request

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

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

考えられる原因

このエラーは、Apigee で重複が許可されていない特定の HTTP ヘッダーがある場合に発生します。 によって送信された HTTP リクエストの一部と同じ値または異なる値で複数回出現 Apigee Edge に送信します。

<ph type="x-smartling-placeholder"></ph>によると RFC 7230、セクション 3.2.2: Field Order送信者は複数のヘッダーを生成してはなりません メッセージ内に同じフィールド名を持つフィールドがあっても、そのフィールド値全体が ヘッダー フィールドはカンマ区切りのリストとして定義されています(例:#(values)] または header フィールド 既知の例外です。Apigee Edge が特定のヘッダーを検出した場合、そのヘッダーには クライアントから送信された HTTP リクエスト で複数回重複があった場合、 400 Bad Request とエラーコードを返す protocol.http.DuplicateHeader

<ph type="x-smartling-placeholder">

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

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

共通の診断手順

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

API Monitoring

<ph type="x-smartling-placeholder">

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

  1. <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインします。 適切なロールが割り当てられます。
  2. 問題を調査する組織に切り替えます。

  3. [Analyze] >API モニタリング >Investigate ページをご覧ください。
  4. エラーが発生した期間を選択します。
  5. プロキシ フィルタが [すべて] に設定されていることを確認します。 <ph type="x-smartling-placeholder">
  6. 障害コードTime に対してプロットします。
  7. 障害コードが protocol.http.DuplicateHeader であるセルを選択してください 次のように指定します。

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

    <ph type="x-smartling-placeholder">
  9. [ログを表示] をクリックし、失敗したリクエストの行を開きます。
  10. [ログ] ウィンドウで、次の詳細をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    1. ステータス コード: 400
    2. 障害の発生元: apigee
    3. 障害コード: protocol.http.DuplicateHeader
  11. [Fault Source] の値が apigee または MP で、[Fault Code] の値が protocol.http.DuplicateHeader です。これは、送信元の HTTP リクエストが クライアントで重複したヘッダーが含まれていました。

Trace ツール

<ph type="x-smartling-placeholder">

NGINX

<ph type="x-smartling-placeholder">

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-code400 エラーが見つかった場合 protocol.http.DuplicateHeader の値と一致する場合、 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. [Fault Source] の値が apigee または MP の場合、 は、クライアント アプリケーションから Apigee に送信されたリクエストに重複する 使用します。
  3. リクエストの一部として複数回送信される実際のヘッダーを判別するには、 次のいずれかの方法を使用できます。

    エラー メッセージ

    エラー メッセージの使用

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

      エラー メッセージの例:

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

    実際のリクエスト

    実際のリクエストの使用

    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 が 1 回だけです。したがって、このリクエストは 400 Bad Request エラーで失敗し、 エラーコード: protocol.http.DuplicateHeader

      <ph type="x-smartling-placeholder">
    2. または、クライアント ログにアクセスできる場合は、 Apigee Edge に対して行われた実際のリクエストに関する情報が表示され、 複数回送信される可能性があります。

解決策

重複を修正する

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

<ph type="x-smartling-placeholder">
  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 プロパティを使用する

<ph type="x-smartling-placeholder">

Apigee では、 CwC プロパティ HTTPHeader.<HeaderName> を使用すると、 重複するヘッダーを Apigee Edge の API プロキシに送信します。

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

たとえば、Message Processor で次のプロパティを設定して、重複と ヘッダー Expires に複数の値が設定されている。

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

仕様

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

仕様
<ph type="x-smartling-placeholder"></ph> RFC 7230、セクション 3.2.2: Field Order
<ph type="x-smartling-placeholder"></ph> 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