<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 fragmentpathコンポーネントは必須であり、必ずスラッシュが必要です (/)。
したがって、バックエンド サーバーのリクエスト 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.EmptyPathX-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.EmptyPathX-Apigee-fault-source targetX-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 + pathurl = https://mocktarget.apigee.net + nulltarget.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