500 Internal Server Error - EmptyPath

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

症状

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

エラー メッセージ

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

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

考えられる原因

このエラーは、フロー変数で表されるバックエンド サーバーのリクエスト URL が <ph type="x-smartling-placeholder"></ph> target.url には空のパスが含まれています。

仕様に従う <ph type="x-smartling-placeholder"></ph> RFC 3986 のセクション 3: Syntax Components と <ph type="x-smartling-placeholder"></ph> RFC 3986、セクション 3.3: Path:

  1. URI の構文 には次のコンポーネントがあります。

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. path コンポーネントは必須であり、必ずスラッシュが必要です (/)。

したがって、バックエンド サーバーのリクエスト URL に path がない場合、 コンポーネントにスラッシュ(/)がない場合、Apigee Edge が 500 Internal Server Error とエラーコードで応答する protocol.http.EmptyPath

たとえば、target.url の値が https://www.mocktarget.apigee.net の場合、このエラーは path コンポーネントが空か、存在しません。

原因 説明 トラブルシューティングの実施対象
バックエンド サーバーの URL(target.url)のパスが空 フロー変数 target.url で表されるバックエンド サーバーの URL のパスが空です。 Edge Public Cloud ユーザーと Edge Private Cloud ユーザー

共通の診断手順

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

API Monitoring

手順 #1: 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.EmptyPath が含まれるセルを選択します。

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

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

  9. [ログ] ウィンドウで、次の詳細をメモします。 <ph type="x-smartling-placeholder">
      </ph>
    • ステータス コード: 500
    • 障害の発生元: target
    • 障害コード: protocol.http.EmptyPath
  10. [Fault Source] が target で [Fault Code] が protocol.http.EmptyPath の場合は、バックエンド サーバーの URL に 空のパスです。

トレース

手順 2: 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. このエラーは通常、Target Request Flow Started の後のフローで発生します 示されます。

  6. トレースのエラーの値をメモします。

    エラー: リクエストパスを空白にすることはできません

    Apigee Edge によってエラーが Target Request Flow Started フェーズの後に発生するため、 バックエンド サーバーの URL の pathであることを示しています。この場合、 フロー変数 target.url(アプリケーションの URL を表す バックエンド サーバー )が、いずれかのポリシーを通じて空のパスで更新された可能性があります リクエスト フローを行います。

  7. 各フローの [Variables Read and Assigned] セクションを、 Target Request Flow Started フェーズに向けたエラーポイント。
  8. フロー変数 target.url が更新されるポリシーを決定します。

    JavaScript ポリシーがフロー変数 target.url を更新したことを示すトレースの例:

    上記のサンプル トレースで、フロー変数の値をメモします。 target.url は、SetTargetURL という名前の JavaScript ポリシーで次のように更新されます。 次のようになります。

    target.url : https://mocktarget.apigee.net
    
  9. target.url には次のコンポーネントがあります。 <ph type="x-smartling-placeholder">
      </ph>
    • スキーム: https://mocktarget.apigee.net
    • path:
  10. このため、エラー Request path cannot be empty が発生します。
  11. トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
  12. [Phase Details] - [Error Headers] セクションまで下にスクロールし、 次のように、X-Apigee-fault-codeX-Apigee-fault-source の値を設定します。

  13. X-Apigee-fault-codeX-Apigee-fault-code と X-Apigee-fault-sourceX-Apigee-fault-code の値が次のように表示されます。 それぞれ protocol.http.EmptyPathtarget であり、 このエラーは、バックエンド サーバーの URL のパスが空であるために発生します。
    レスポンス ヘッダー
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

手順 #3: 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.EmptyPath発生した( 過去)または 500 でまだ失敗しているリクエストがあるかどうか。
  4. X-Apigee-fault-code が一致する 500 エラーがある場合 protocol.http.EmptyPath の値を取得してから、 X-Apigee-fault-source.

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

    NGINX アクセスログの上記のサンプル エントリには、X- Apigee-fault-code X-Apigee-fault-source:

    ヘッダー
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    X-Apigee-fault-codeX-Apigee-fault-code と X-Apigee-fault-sourceX-Apigee-fault-code の値がそれぞれ それぞれ protocol.http.EmptyPathtarget であり、 このエラーは、バックエンド サーバーの URL に空のパスが含まれている場合に発生します。

原因: バックエンド サーバーの URL(target.url)のパスが空

診断

  1. API Monitoring、Trace ツール、または NGINX アクセスログを使用して、500 Internal Server Error障害コード障害ソースを特定します。詳しくは、 一般的な診断手順
  2. 障害コードprotocol.http.EmptyPath で、障害ソースが 値 target の場合は、バックエンド サーバーの URL に空の値が含まれている あります
  3. バックエンド サーバーの URL は、Apigee のフロー変数 target.url で表されます。 。このエラーは通常、バックエンド サーバーの URL、つまり target.url の任意のポリシーを使用して動的に( プロキシ/共有フローなど)をターゲット リクエスト フロー内で使用し、空のパスを持つようにします。

    <ph type="x-smartling-placeholder">
  4. フロー変数 target.url に空のパスがあり、 次のいずれかの手順を使用します。

    トレース

    Trace ツールの使用

    このエラーのトレースをキャプチャした場合は、 Trace ツールの使用 と、以下を行います。

    1. target.url に空のパスがあるかどうかを確認します。
    2. 「はい」の場合は、どのポリシーが target.url: 空のパスを含めます。

      JavaScript ポリシーがフロー変数を更新したことを示すサンプル トレース target.url:

    3. 上記のサンプル トレースでは、JavaScript ポリシーが変更または変更されていることがわかります。 空のパスを含むように target.url の値を更新しました。
    4. target.url には次のコンポーネントがあります。 <ph type="x-smartling-placeholder">
        </ph>
      • スキーム: https://mocktarget.apigee.net
      • path:

    ログ

    ログサーバーでのログの使用

    1. このエラー(断続的に発生する問題)のトレースが見当たらない場合は、以下を確認してください。 フロー変数の値に関する情報をログに記録したかどうかを確認する target.url(次のようなポリシーを使用) <ph type="x-smartling-placeholder"></ph> MessageLogging または <ph type="x-smartling-placeholder"></ph> ServiceCallout をログサーバーに追加します。
    2. ログがある場合は、それらを確認して以下を行います。 <ph type="x-smartling-placeholder">
        </ph>
      1. target.url のパスが空かどうかを確認します。また、
      2. target.url を変更したポリシーを特定できるかどうかを確認する 空のパスを含める

    API プロキシ

    失敗した API プロキシの確認

    このエラーのトレースやログがない場合は、失敗した API を確認してください。 プロキシを使用して、フロー変数 target.url を変更または更新された内容を特定 無効なパスが含まれている可能性があります。次の点を確認してください。

    • API プロキシ内のポリシー
    • プロキシから呼び出される共有フロー
  5. 変更または変更した特定のポリシー(AssignMessage や JavaScript など)を調べる フロー変数 target.url を慎重に更新し、更新の原因を特定する target.url: 空のパスを指定します。

    フロー変数 target.url を更新するポリシーの例を次に示します。 空のパスが含まれているとこのエラーが発生します。

    サンプル 1

    サンプル 1: target.url 変数を更新する JavaScript ポリシー

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    上記のサンプルでは、フロー変数 target.url が更新されています。 値は https://mocktarget.apigee.net で、別の変数に格納されます。 url

    target.url には次のコンポーネントがあります。

    • スキーム: https://mocktarget.apigee.net
    • path:

    パスが空であるため、Apigee Edge は 500 Internal Server Error を返します。 エラーコード protocol.http.EmptyPath

    サンプル 2

    サンプル 2: target.url 変数を更新する JavaScript ポリシー

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    上記のサンプルでは、フロー変数 target.url が次のように更新されています。 変数に含まれる値 https://mocktarget.apigee.net を連結する url 別の変数 path の値。 値は request.header.Path. から取得されます

    実際のリクエストまたはトレースにアクセスできる場合は、実際の値を検証できます。 request.header.Path に渡されます。

    お客様からのリクエストの例:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    この例では、ヘッダーパスはリクエストの一部として送信されません。したがって、 JavaScript ポリシー内の変数パスが null である。

    それによって次のようになります。

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    target.url には次のコンポーネントがあります。

    • スキーム: https://mocktarget.apigee.netnull
    • path:

    サンプル 3

    サンプル 3: AssignMessage ポリシーによる target.url 変数の更新 別の変数

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    target.url には次のコンポーネントがあります。

    • スキーム: https://mocktarget.apigee.net
    • path:

    これらすべての例で、バックエンド サーバーの URL のパス、つまり target.url は空のため、Apigee Edge から返されます。 500 Internal Server Error(エラーコード: protocol.http.EmptyPath)。

解決策

仕様に従う <ph type="x-smartling-placeholder"></ph> RFC 3986、セクション 2: Syntax Components で、path コンポーネントは、 必須です。スラッシュ(/)がない場合でも、必ずスラッシュ(/)が必要です。 他の文字を path の一部として使用できます。次の操作を行います。 この問題を修正します。

  1. フロー変数で表されるバックエンド サーバーの URL を確認する target.url は常に空でないパスを持ちます。
    1. パスにリソース名がない場合もあるため、パスに 少なくともスラッシュ(/)がある。
    2. 他の変数を使用してフロー変数の値を決定する場合 target.url。他の変数のパスが空でないことを確認します。
    3. フロー変数の値を決定する文字列オペレーションを実行する場合 target.url の場合は、文字列の結果または結果が 空のパスは指定できません。
  2. 診断で説明したサンプルでは、この問題を次のように解決できます。 以下で説明します。

    サンプル 1

    サンプル 1: target.url 変数を更新する JavaScript ポリシー

    これを修正するには、変数 url にスラッシュ(/)を追加します。 次のような問題があります。

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    サンプル 2

    サンプル 2: target.url 変数を更新する JavaScript ポリシー

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    値として、有効なパス(例: /iloveapis)を この問題は、次のようにリクエスト ヘッダー Path で解決します。

    リクエストの例:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    サンプル 3

    サンプル 3: AssignMessage ポリシーによる target.url 変数の更新 別の変数

    AssignMessage ポリシーの <Value> 要素に有効なパスを追加します。対象 たとえば、/json を次のパスとして MockTarget API。 つまり、<Value> 要素を 次のように https://mocktarget.apigee.net/json を設定します。

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

仕様

Apigee Edge では、次に示すように、バックエンド サーバーの URL には空のパスがないことが想定されます。 次の仕様を満たす必要があります。

仕様
<ph type="x-smartling-placeholder"></ph> RFC 3986、セクション 3: Syntax Components
<ph type="x-smartling-placeholder"></ph> RFC 3986、セクション 3.3: Path

Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合

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

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

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

  • 組織名
  • 環境名
  • API プロキシ名
  • エラーコード protocol.http.EmptyPath とともに 500 Internal Server Error を再現するために使用する curl コマンドを完成させる
  • 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

参照

フロー変数 - ターゲット