500 Internal Server Error - BadFormData

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

症状

クライアント アプリケーションは、次の HTTP ステータス コード 500 Internal Server Error を取得します。 API 呼び出しのレスポンスとしてエラーコード protocol.http.BadFormData

エラー メッセージ

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

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

フォームデータ

この問題のトラブルシューティングの詳細に入る前に、フォームデータとは何かを理解しましょう。

フォームデータとは、通常は要素を含む HTML フォームを通じてユーザーが提供する情報です。 テキスト入力ボックス、ボタン、チェックボックスなどに入力できます。フォームデータは通常、 Key-Value ペアを HTTP リクエストまたはレスポンスの一部として使用できます。

フォームデータの転送

  1. Content-Type: application/x-www-form-urlencoded <ph type="x-smartling-placeholder">
      </ph>
    • フォームデータのサイズが小さい場合、データは次の Key-Value ペアとして送信されます。 <ph type="x-smartling-placeholder">

      フォームデータを伴うリクエストの例:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • キーと値の両方に含まれる英数字以外の文字は、 <ph type="x-smartling-placeholder"></ph> パーセント エンコードとは、文字 3 文字表記です。 パーセント記号の後に 2 桁の 16 進数が続く %HH 特定の文字の ASCII コードを表します。
    • したがって、フォームデータではパーセント記号(%)を使用できますが、 特別なエスケープ シーケンスの開始として解釈されます。フォームデータから キーまたは値にパーセント記号(%)が含まれていると、送信する必要がある %25, として、パーセント記号の ASCII コードを表します。 (%)文字。
  2. コンテンツ タイプ: multipart/form-data

    大量のバイナリデータや非 ASCII を含むテキストを送信する場合 使用してデータを Content-Type: multipart/form-data: <ph type="x-smartling-placeholder"></ph> フォーム - セクション 17.13.4.2

考えられる原因

このエラーは、次のすべての条件が満たされた場合にのみ発生します。

  1. クライアントから Apigee Edge に送信される HTTP リクエストには、次のものが含まれます。 <ph type="x-smartling-placeholder">
      </ph>
    1. Content-Type: application/x-www-form-urlencoded、および
    2. パーセント記号(%)またはパーセント記号を含むフォームデータ (%)の後に、許可されていない無効な 16 進数文字が続きます <ph type="x-smartling-placeholder"></ph> フォーム - セクション 17.13.4.1
  2. Apigee Edge の API プロキシは、任意の文字を含む特定のフォーム パラメータを読み取ります。 許可されていないリクエスト フローで ExtractVariables または AssignMessage ポリシー。

    たとえば、フォームデータにパーセント記号(%)がそのまま含まれている場合( またはパーセント記号(%の後に無効な 16 進数が続きます 文字が含まれていると、このエラーが発生します。

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

    原因 説明 トラブルシューティングの実施対象
    リクエストのフォーム パラメータに使用できない文字が含まれています クライアントによって 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. 障害コードTime に対してプロットします。

    <ph type="x-smartling-placeholder">
  6. 障害コード protocol.http.BadFormData を持つセルを選択します。 下に示します。

    大きい画像を表示

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

    大きい画像を表示

  8. [ログを表示] をクリックし、失敗したリクエストの行を開きます。

  9. [ログ] ウィンドウで、次の詳細をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    • ステータス コード: 500
    • 障害の発生元: proxy
    • 障害コード: protocol.http.BadFormData
    • 障害ポリシー: extractvariables/EV-ExtractFormParams
  10. [Fault Source] が proxy の場合、[Fault Code] は protocol.http.BadFormData障害ポリシーが空でない場合、 エラーが発生している間、エラーが発生したことを示します。 Policy が、なんらかの情報を含むフォームデータ(フォーム パラメータ)を読み取りまたは抽出していました 使用できない文字が含まれています。
  11. この例では、X-Apigee-fault-policyextractvariables/EV- ExtractFormParams, です。これは、次の名前の ExtractVariables ポリシーを意味します。 フォームの読み取りまたは抽出中に EV-ExtractFormParams が失敗する あります。

Trace ツール

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

Trace ツールを使用してエラーを診断するには:

  1. トレース セッションを有効にする および次のいずれかです。 <ph type="x-smartling-placeholder">
      </ph>
    • 500 Internal Server Error エラーが発生するのを待つ。または
    • 問題を再現できる場合は、API 呼び出しを行って問題を再現してください。 500 Internal Server Error
  2. [Show all FlowInfos] が有効になっていることを確認します。

  3. 失敗したリクエストのいずれかを選択し、トレースを調べます。
  4. トレースのさまざまなフェーズを順に確認し、障害が発生している場所を特定する 発生しました。
  5. このエラーは通常、以下に示すいずれかのポリシーで発生します。

    上記のサンプル トレースでは、ゾーン時間内で障害が発生したことに注意してください。 EV-ExtractFormParams という名前の ExtractVariables ポリシー。

  6. 失敗した特定のポリシーの後にある Error という名前のフローに移動します。

  7. トレースから次の値をメモします。

    エラー: Bad Form Data

    状態: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • エラー Bad Form Data の値は、フォームが パラメータに使用できない文字が含まれています。
    • 状態 PROXY_REQ_FLOW, の値は、 API プロキシのリクエスト フローで発生したエラー。
  8. トレースの [AX(Analytics Data Recorded)] フェーズに移動して、 できます。
  9. [Phase Details] - [Error Headers] セクションまで下にスクロールし、 X-Apigee-fault-codeX-Apigee-fault-code、X-Apigee-fault-sourceX-Apigee-fault-codeX-Apigee-fault-policy を次のように設定します。

  10. X-Apigee-fault-codeX-Apigee-fault-source の値が はそれぞれ protocol.http.BadFormDatapolicy です。 X-Apigee-fault-policy が空ではありません。これはエラーが X-Apigee-fault-policy に指定された特定のポリシーが 文字を含むフォームデータ(フォームパラメータ)の読み取りまたは抽出 使用できません

    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. この例では、X-Apigee-fault-policyextractvariables/EV- ExtractFormParams, です。これは、名前を付けた ExtractVariables ポリシーを意味します。 フォームの読み取りまたは抽出中に EV-ExtractFormParams が失敗しました あります。

NGINX

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

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

  1. Private Cloud ユーザーは、NGINX アクセスログを使用して次のことを行えます。 HTTP 500 Internal Server Error に関する重要な情報を確認します。
  2. NGINX アクセスログを確認します。

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

    <ph type="x-smartling-placeholder">
  3. エラーコードを含む 500 エラーがないか検索します 特定の期間に protocol.http.BadFormData(問題が発生したり 発生した場合)や、引き続き特定のイベントで失敗するリクエストが 500
  4. X-Apigee-fault-code500 エラーが見つかった場合 protocol.http.BadFormData の値と一致する場合、 X-Apigee-fault-source の値を判別し、 X-Apigee-fault-policy.

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

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

    ヘッダー
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. X-Apigee-fault-codeX-Apigee-fault-source の値が それぞれprotocol.http.BadFormDatapolicy X-Apigee-fault-policy が空ではありません。これはエラーが X-Apigee-fault-policy, に示された特定のポリシーが 文字を含むフォームデータ(フォームパラメータ)の読み取りまたは抽出 使用できません
  6. この例では、X-Apigee-fault-policyextractvariables/EV- ExtractFormParams, です。これは、名前を付けた ExtractVariables ポリシーを意味します。 フォームの読み取り中に EV-ExtractFormParams に失敗しました あります。

原因: リクエストのフォーム パラメータに使用できない文字が含まれている

診断

  1. 説明に沿って、API Monitoring、Trace ツール、または NGINX アクセスログを使用して、500 Internal Server Error障害コード障害ソース障害ポリシーを特定します。 一般的な診断手順をご覧ください。
  2. [Fault Code] が protocol.http.BadFormData の場合、[Fault Source] には、 値が proxy または policy で、Fault Policy が 空, 障害ポリシー,に指定されたポリシーが失敗したことを示します。 フォームデータ(フォーム パラメータ)の読み取りや抽出を行います。
  3. 障害ポリシーに示されたポリシーを調べて、次のことを確認します。 含まれます <ph type="x-smartling-placeholder">
      </ph>
    1. ソース: ポリシーがデータの読み取りまたは抽出を行っているかどうかを判別します。 指定することもできます。
    2. フォーム パラメータ: 読み取られる特定のフォーム パラメータを特定する に関するポリシーに準拠する必要があります。

      サンプル 1

      サンプル 1: フォーム パラメータを抽出する ExtractVariables ポリシー:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      上記の ExtractVariables ポリシーで、次のようにします。

      • 出典: request

        これは <Source> 要素で示されます。

      • フォーム パラメータ: usernamepassword

        これは、<Pattern> 要素で示されます。 <FormParam> 要素

      これは、フォーム パラメータ usernamepassword は、クライアントから HTTP リクエストの一部として渡されます。 Apigee Edge に使用できない文字が含まれています。

      サンプル 2

      サンプル 2: フォームのパラメータをコピーする AssignMessage ポリシー:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      上記の ExtractVariables ポリシーで、次のようにします。

      • ソース: request

        これは、次の属性の source 属性で示されます。 <Copy> 要素

      • フォーム パラメータ: usernamepassword

        これは、次の属性の name 属性で示されます。 <FormParam> 要素

      これは、フォーム パラメータ usernamepassword、または クライアントから Apigee Edge に HTTP リクエストの一部として渡される両方に、 使用できない文字が含まれています。

  4. 使用できない文字がないか確認します。 ステップ 3 で特定したフォーム パラメータで使用されている文字の数 次のいずれかの方法を使用します。

    Trace ツール

    Trace ツールを使用して検証するには:

    1. 失敗したリクエストのトレースをキャプチャした場合 一般的な診断手順] をクリックし、次のいずれかを選択します。 表示されます。
    2. なんらかの文字を含むフォーム パラメータが 指定された HTTP リクエストの一部として、 手順 3 を確認してから、 <ph type="x-smartling-placeholder">
        </ph>
      1. Request Received from Client」フェーズに進みます。
      2. [Phase Details] セクションまで下にスクロールして、 コンテンツのリクエスト

        ( 拡大画像を表示

      3. 上記の例では、フォーム パラメータ password が パーセント記号(%)が含まれます。
      4. パーセント記号(%)は <ph type="x-smartling-placeholder"></ph> パーセント エンコーディングでは、特殊文字をそのまま使用することはできません。 必要があります。
      5. したがって、Apigee Edge は 500 Internal Server Error は、エラーコードに置き換えます。 protocol.http.BadFormData

    実際のリクエスト

    実際のリクエストを使用して検証するには:

    1. ターゲット サーバーに対する実際のリクエストにアクセスできない場合は、 [解決策] に進みます。
    2. Apigee Edge に対して行われた実際のリクエストにアクセスできる場合は、次のコマンドを実行します。 次のとおりです。 <ph type="x-smartling-placeholder">
        </ph>
      1. フォームのデータの内容を確認し、 パーセント記号(%)などは使用できない またはパーセント記号(%に続く無効な文字 使用できます。

        サンプル 1

        リクエストの例 1: リクエストの一部としてのフォームデータ

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        この例では、要素 client_secret が、 パーセント記号(%)とそれに続く文字列が含まれます 無効な 16 進数値 ZY です。

        サンプル 2

        リクエストの例 2: ファイルで渡されるフォームデータ:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        form_data.xml の内容:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
        

        この例では、要素 password にパーセント記号(%)が含まれていますが、これは指定できません。 フォームデータでそのまま渡されます。

    3. 上記の 2 つの例では、HTTP リクエストの一部として送信されたフォームデータが、 Apigee Edge に使用できない文字が含まれています。
    4. したがって、Apigee Edge は 500 Internal Server Error で応答します。 (エラーコード protocol.http.BadFormData)。

解決策

  1. フォームデータまたはパラメータのキーと値の両方に特殊文字が含まれていることを確認する によって送信される HTTP リクエストの一部として送信されると、そのメッセージは常に、で説明されているように、 Form Data - application/x-www-form-urlencoded
  2. 上記の例では、次のように問題を解決できます。

    サンプル 1

    サンプル 1: リクエストの一部として渡されるフォームデータ:

    有効な を使用してください 特定の文字の ASCII コードと一致する文字(16 進数)。 たとえば、ドル記号($)を送信する場合は %24 を使用します。 次のように指定します。

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    サンプル 2

    リクエストの例 2: ファイルで渡されるフォームデータ:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    form_data.xml の内容:

    こちらの <ph type="x-smartling-placeholder"></ph> percent-encoding はパーセント(%)記号、つまりファイルを次のように変更します 次のように %25 を設定します。

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
    

仕様

Apigee Edge では、フォームデータが次の仕様に従って送信されることを想定しています。

仕様
<ph type="x-smartling-placeholder"></ph> フォームデータ - application/x-www-form-urlencoded

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

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

上記の手順でも問題が解決しない場合は、以下の情報を収集します。 Apigee Edge サポートにお問い合わせください。

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

  • 組織名
  • 環境名
  • API プロキシの名前
  • 問題の再現に使用する完全な curl コマンド エラーコードを付加した 500 Internal Server Error protocol.http.BadFormData
  • API リクエストのトレース ファイル

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

  • 失敗したリクエストについて観測された完全なエラー メッセージ
  • 環境名
  • API プロキシ バンドル
  • 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

参照