<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:
URI の構文 には次のコンポーネントがあります。
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
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 を使用してエラーを診断するには:
- <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインします。 適切なロールが割り当てられます。
問題を調査する組織に切り替えます。
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
- エラーが発生した期間を選択します。
障害コードを Time に対してプロットします。
<ph type="x-smartling-placeholder">以下のように、障害コード
protocol.http.EmptyPath
が含まれるセルを選択します。障害コード
protocol.http.EmptyPath
に関する情報が次のように表示されます。 下に示します。[ログを表示 ] をクリックして、失敗したリクエストの行を開きます。
- [ログ] ウィンドウで、次の詳細をメモします。
<ph type="x-smartling-placeholder">
- </ph>
- ステータス コード:
500
- 障害の発生元:
target
- 障害コード:
protocol.http.EmptyPath
- ステータス コード:
- [Fault Source] が
target
で [Fault Code] がprotocol.http.EmptyPath
の場合は、バックエンド サーバーの URL に 空のパスです。
トレース
手順 2: Trace ツールを使用する
<ph type="x-smartling-placeholder">Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にし、以下のいずれかを行います。
<ph type="x-smartling-placeholder">
- </ph>
500 Internal Server Error
エラーが発生するのを待つ。または- 問題を再現できる場合は、API 呼び出しを行って問題を再現してください。
500 Internal Server Error
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを調べます。
- トレースのさまざまなフェーズを移動して、エラーが発生した場所を特定します。
このエラーは通常、Target Request Flow Started の後のフローで発生します 示されます。
トレースのエラーの値をメモします。
エラー: リクエストパスを空白にすることはできません
Apigee Edge によってエラーが Target Request Flow Started フェーズの後に発生するため、 バックエンド サーバーの URL の
path
が空であることを示しています。この場合、 フロー変数target.url
(アプリケーションの URL を表す バックエンド サーバー )が、いずれかのポリシーを通じて空のパスで更新された可能性があります リクエスト フローを行います。- 各フローの [Variables Read and Assigned] セクションを、 Target Request Flow Started フェーズに向けたエラーポイント。
フロー変数
target.url
が更新されるポリシーを決定します。JavaScript ポリシーがフロー変数
target.url
を更新したことを示すトレースの例:上記のサンプル トレースで、フロー変数の値をメモします。
target.url
は、SetTargetURL という名前の JavaScript ポリシーで次のように更新されます。 次のようになります。target.url : https://mocktarget.apigee.net
target.url
には次のコンポーネントがあります。 <ph type="x-smartling-placeholder">- </ph>
- スキーム:
https://mocktarget.apigee.net
- path: 空
- スキーム:
- このため、エラー
Request path cannot be empty
が発生します。 - トレースの [AX(Analytics Data Recorded)] フェーズに移動してクリックします。
[Phase Details] - [Error Headers] セクションまで下にスクロールし、 次のように、X-Apigee-fault-code と X-Apigee-fault-source の値を設定します。
- X-Apigee-fault-codeX-Apigee-fault-code と X-Apigee-fault-sourceX-Apigee-fault-code の値が次のように表示されます。
それぞれ
protocol.http.EmptyPath
、target
であり、 このエラーは、バックエンド サーバーの URL のパスが空であるために発生します。レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
手順 #3: NGINX アクセスログを使用する
<ph type="x-smartling-placeholder">NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して、
HTTP
500 Internal Server Error
に関する重要な情報。 NGINX アクセスログを確認します。
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- エラーコードを含む
500
エラーがないか検索します 特定の期間にprotocol.http.EmptyPath
発生した( 過去)または500
でまだ失敗しているリクエストがあるかどうか。 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.EmptyPath
、target
であり、 このエラーは、バックエンド サーバーの URL に空のパスが含まれている場合に発生します。
原因: バックエンド サーバーの URL(target.url)のパスが空
診断
- API Monitoring、Trace ツール、または NGINX アクセスログを使用して、
500 Internal Server Error
の障害コードと障害ソースを特定します。詳しくは、 一般的な診断手順。 - 障害コードが
protocol.http.EmptyPath
で、障害ソースが 値target
の場合は、バックエンド サーバーの URL に空の値が含まれている あります。 バックエンド サーバーの URL は、Apigee のフロー変数
<ph type="x-smartling-placeholder">target.url
で表されます。 。このエラーは通常、バックエンド サーバーの URL、つまりtarget.url
の任意のポリシーを使用して動的に( プロキシ/共有フローなど)をターゲット リクエスト フロー内で使用し、空のパスを持つようにします。- フロー変数
target.url
に空のパスがあり、 次のいずれかの手順を使用します。トレース
Trace ツールの使用
このエラーのトレースをキャプチャした場合は、 Trace ツールの使用 と、以下を行います。
target.url
に空のパスがあるかどうかを確認します。「はい」の場合は、どのポリシーが
target.url
: 空のパスを含めます。JavaScript ポリシーがフロー変数を更新したことを示すサンプル トレース
target.url:
- 上記のサンプル トレースでは、JavaScript ポリシーが変更または変更されていることがわかります。
空のパスを含むように
target.url
の値を更新しました。 target.url
には次のコンポーネントがあります。 <ph type="x-smartling-placeholder">- </ph>
- スキーム:
https://mocktarget.apigee.net
- path: 空
- スキーム:
ログ
ログサーバーでのログの使用
- このエラー(断続的に発生する問題)のトレースが見当たらない場合は、以下を確認してください。
フロー変数の値に関する情報をログに記録したかどうかを確認する
target.url
(次のようなポリシーを使用) <ph type="x-smartling-placeholder"></ph> MessageLogging または <ph type="x-smartling-placeholder"></ph> ServiceCallout をログサーバーに追加します。 - ログがある場合は、それらを確認して以下を行います。
<ph type="x-smartling-placeholder">
- </ph>
target.url
のパスが空かどうかを確認します。また、target.url
を変更したポリシーを特定できるかどうかを確認する 空のパスを含める
API プロキシ
失敗した API プロキシの確認
このエラーのトレースやログがない場合は、失敗した API を確認してください。 プロキシを使用して、フロー変数
target.url
を変更または更新された内容を特定 無効なパスが含まれている可能性があります。次の点を確認してください。- API プロキシ内のポリシー
- プロキシから呼び出される共有フロー
変更または変更した特定のポリシー(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
の一部として使用できます。次の操作を行います。
この問題を修正します。
- フロー変数で表されるバックエンド サーバーの URL を確認する
target.url
は常に空でないパスを持ちます。- パスにリソース名がない場合もあるため、パスに
少なくともスラッシュ(
/
)がある。 - 他の変数を使用してフロー変数の値を決定する場合
target.url
。他の変数のパスが空でないことを確認します。 - フロー変数の値を決定する文字列オペレーションを実行する場合
target.url
の場合は、文字列の結果または結果が 空のパスは指定できません。
- パスにリソース名がない場合もあるため、パスに
少なくともスラッシュ(
- 診断で説明したサンプルでは、この問題を次のように解決できます。
以下で説明します。
サンプル 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
ここで、ORG、ENV、PORT# は、 使用します。
- Message Processor システムログ
/opt/apigee/var/log/edge-message- processor/logs/system.log