ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとして、エラーコード protocol.http.EmptyPath を含む HTTP ステータス コード 500 Internal Server Error を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 500 Internal Server Error
さらに、次のエラー メッセージも確認できます。
{
"fault":{
"faultstring":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}考えられる原因
このエラーは、フロー変数
target.urlで表されるバックエンド サーバーのリクエスト URL に空のパスが含まれている場合に発生します。
仕様 RFC 3986、セクション 3: Syntax Components と 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 と Private Cloud のユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
手順 1: API Monitoring を使用する
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UIにログインします。
問題を調査する組織に切り替えます。

- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
[障害コード] を [時間] に対してプロットします。
次のように、障害コード
protocol.http.EmptyPathを含むセルを選択します。
次のように、障害コード
protocol.http.EmptyPathに関する情報が表示されます。
[ログを表示 ] をクリックして、失敗したリクエストの行を展開します。
- [ログ] ウィンドウで、次の詳細を確認します。
- ステータス コード:
500 - 障害ソース:
target - 障害コード:
protocol.http.EmptyPath
- ステータス コード:
- 障害ソース が
targetで、障害コード がprotocol.http.EmptyPathの場合、バックエンド サーバーの URL に空のパスがあることを示します。
トレース
手順 2: Trace ツールを使用する
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
500 Internal Server Errorエラーが発生するまで待つ。- 問題を再現できる場合は、API 呼び出しを行って問題を再現する
500 Internal Server Error
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択し、トレースを調べます。
- トレースのさまざまなフェーズを調べて、障害が発生した場所を特定します。
通常、エラーは次のように [Target Request Flow Started] フェーズの後のフローにあります。
トレースからエラーの値を確認します。
error: Request path cannot be empty
エラーは [Target Request Flow Started] フェーズの後に Apigee Edge によって発生するため、
pathがバックエンド サーバーの URL で 空 であることを示します。これは、リクエスト フロー内のいずれかのポリシーによって、フロー変数target.url(バックエンド サーバー の URL を表す)が空のパスで更新された場合に発生する可能性が高くなります。- エラーポイントから [Target Request Flow Started] フェーズに向かって、各フローの [Variables Read and Assigned] セクションを調べます。
フロー変数
target.urlが更新されるポリシーを特定します。JavaScript ポリシーがフロー変数
target.urlを更新したことを示すトレースの例:
上記のトレース例では、フロー変数
target.urlの値がSetTargetURLという名前の JavaScript ポリシーで次のように更新されています。target.url : https://mocktarget.apigee.net
target.urlには次のコンポーネントが含まれます。- スキーム:
https://mocktarget.apigee.net - パス: 空
- スキーム:
- そのため、エラー
Request path cannot be emptyが発生します。 - トレースの [AX](記録された分析データ)フェーズに移動してクリックします。
[Phase Details] - [Error Headers] セクションまでスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を特定します。

- X-Apigee-fault-code と X-Apigee-fault-source の値はそれぞれ
protocol.http.EmptyPathとtargetになります。これは、 バックエンド サーバーの URL に空のパスがあるためにこのエラーが発生したことを示しています。レスポンス ヘッダー 値 X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
手順 3: NGINX アクセスログを使用する
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して HTTP
500 Internal Server Errorに関する重要な情報を特定できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- 特定の期間(過去に問題が発生した場合)にエラーコード
protocol.http.EmptyPathを含む500エラーがあるかどうか、または500で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が値
protocol.http.EmptyPathに一致する500エラーが見つかった場合は、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-code と X-Apigee-fault-source の値は
protocol.http.EmptyPathとtargetになります。これは、バックエンド サーバーの URL に 空のパス があるためにこのエラーが発生したことを示しています。
原因: バックエンド サーバーの URL(target.url)に空のパスがある
診断
-
共通の診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、
500 Internal Server Errorの障害コード と障害ソース を特定します。 - 障害コード が
protocol.http.EmptyPathで、障害ソース の値がtargetの場合、バックエンド サーバーの URL に空のパス があることを示します。 バックエンド サーバーの URL は、Apigee Edge のフロー変数
target.urlで表されます。通常、このエラーは、ターゲット リクエスト フロー内のいずれかのポリシー( プロキシ/共有フロー内)を使用して、バックエンド サーバーの URL(target.url動的に更新しようとしたときに発生します。その結果、空のパスが含まれるようになります。- フロー変数
target.urlに空のパスが含まれているかどうかと、その値のソースを次のいずれかの手順で特定します。トレース
Trace ツールを使用する
このエラーのトレースをキャプチャした場合は、 Trace ツールの使用 で説明されている手順を使用します。
target.urlに空のパスが含まれているかどうかを確認します。含まれている場合は、
target.urlの値を変更または更新して空のパスを含めたポリシーを特定します。JavaScript ポリシーがフロー変数
target.url:を更新したことを示すトレースの例:
- 上記のトレース例では、JavaScript ポリシーが
target.urlの値を変更または更新して空のパスを含めていることがわかります。 target.urlには次のコンポーネントが含まれます。- スキーム:
https://mocktarget.apigee.net - パス: 空
- スキーム:
ログ
ログサーバーでログを使用する
- このエラーのトレースがない場合(断続的な問題)、
MessageLogging や
ServiceCallout などのポリシーを使用して、フロー変数
target.urlの値に関する情報をログサーバーに記録しているかどうかを確認します。 - ログがある場合は、ログを確認して次のことを行います。
target.urlに空のパスが含まれているかどうかを確認する。target.urlを変更して空のパスを含めたポリシーを特定できるかどうかを確認する。
API プロキシ
失敗した API プロキシを確認する
このエラーのトレースまたはログがない場合は、失敗した API プロキシを確認して、フロー変数
target.urlを変更または更新して 無効なパス を含めたものを特定します。以下をご確認ください。- API プロキシ内のポリシー
- プロキシから呼び出された共有フロー
フロー変数
target.urlを変更または 更新する特定のポリシー(AssignMessage や JavaScript など)を慎重に調べ、target.urlを更新して空のパスを含める原因を特定します。フロー変数
target.urlを誤って更新して空のパスを含め、このエラーを引き起こすポリシーの例をいくつか示します。サンプル 1
サンプル 1: JavaScript ポリシーが
target.url変数を更新するvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
上記のサンプルでは、フロー変数
target.urlが別の変数urlに含まれる値https://mocktarget.apigee.netで更新されています。target.urlには次のコンポーネントが含まれます。- スキーム:
https://mocktarget.apigee.net - パス: 空
パスが空であるため、Apigee Edge は
500 Internal Server Errorと エラーコードprotocol.http.EmptyPathを返します。サンプル 2
サンプル 2: JavaScript ポリシーが
target.url変数を更新するvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
上記のサンプルでは、フロー変数
target.urlが、変数urlに含まれる値https://mocktarget.apigee.netと 、request.header.Path.から取得された別の変数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 - パス: 空
サンプル 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 - パス: 空
上記のすべての例で、バックエンド サーバーの URL のパス(
target.url)が空であるため、Apigee Edge は500 Internal Server Errorとエラーコードprotocol.http.EmptyPathを返します。- スキーム:
解決策
仕様
RFC 3986、セクション 2: Syntax Components に準拠しています。path コンポーネントは
必須 であり、path の一部として他の文字がない場合でも、常にスラッシュ(`/`)を含める必要があります。この問題を解決するには、次の操作を行います。
この問題を解決するには、次の操作を行います。
- フロー変数
target.urlで表されるバックエンド サーバーの URL に、常に空でないパス が含まれていることを確認します。- パスにリソース名がない場合は、パスに少なくともスラッシュ(
/)が含まれていることを確認します。 - 他の変数を使用してフロー変数
target.urlの値を決定する場合は、他の変数に空のパスが含まれていないことを確認します。 - 文字列操作を行ってフロー変数
target.urlの値を決定する場合は、文字列操作の結果または出力に空のパスが含まれていないことを確認します。
- パスにリソース名がない場合は、パスに少なくともスラッシュ(
- 診断で説明したサンプルでは、この問題を次のように解決できます。
サンプル 1
サンプル 1: JavaScript ポリシーが
target.url変数を更新する次の例のように、変数
urlにスラッシュ(/)を追加して、この問題を解決します。var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
サンプル 2
サンプル 2: JavaScript ポリシーが
target.url変数を更新するvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
次の例のように、リクエスト ヘッダー
Pathの一部として有効なパス(/iloveapisなど)を渡して、この問題を解決します。リクエスト例:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
サンプル 3
サンプル 3: AssignMessage ポリシーが別の変数を介して
target.url変数を更新するAssignMessage ポリシーの
<Value>要素に有効なパスを追加します。たとえば、MockTarget API のパスとして/jsonを使用できます。つまり、次の例のように<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 に空のパスが含まれていない ことが 次の仕様に従って 想定されています。
| 仕様 |
|---|
| RFC 3986、セクション 3: Syntax Components |
| 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