目次
記事の概要と対象者
本記事は、Kong がクライアントリクエスト URL を処理する際の path ハンドリング(挙動)について解説します。本記事を読むと、Kong がリクエスト URL をどのようなアルゴリズムで処理をするか理解することができます。本記事の対象者は、Kong で service や route を登録して、動作させようとしている人、もしくは、動作させたことがある人を想定しています。
もし、Kong の Service や Route オブジェクトの設定方法が知りたいという場合は以下の記事を参考にしてみてください。
Kong の path ハンドリングアルゴリズムの種類について
Kong は path ハンドリングのアルゴリズムが以下の2種類あります。Kong のバージョンによって採用されている path ハンドリングのアルゴリズムが異なります。
v0:Kong 0.x と 2.x で使用
v1:Kong 1.x で使用
各アルゴリズムの処理について
v0(Kong 0.x, 2.x で使用)
Kong は service.path, route.path, request path をリクエスト URL のセグメント(一部)として取り扱い、それらを /(スラッシュ)で繋げてアップストリームのサービスに転送します。たとえば各 path を下記のように仮定した場合、kong で連結してアップストリームに転送する path は、デフォルトで /service/contents になります。
service.path – /service
route.path – /route
request path – /route/contents
route.path にある /route はリクエスト URL のマッチングに使用されます。また、route.path は後述する strip_path パラメータの設定で kong がプロキシする path に route.path(/route)を含んだり、含まなかったり挙動を変更する事ができます。デフォルトの設定(string_path=true)では、route.path を含まないため、kong がプロキシする path は /service/contents になります。
補足として、string_path=false にした場合は /service/route/contents になります。
なお、連結されたパスがシングルスラッシュになる場合、path に変化は何も起きません。もし、それより長い path の場合は、トレイリングスラッシュが削除されます。
v1(Kong 1.x で使用)
Kong 1.x で使われている v1 では、service.path がプレフィックスとして扱われ、route.path と request.path の最初のスラッシュは無視されます。たとえば各 path を下記のように仮定した場合、kong で連結された path は string_path=true の場合 /service/contents になります。
service.path – /service
route.path – /route
request path – /route/contents
なお、v1 のアルゴリズムで string_path=false にすると、/serviceroute/contents になります。
どちらのアルゴリズムも連結時のダブルスラッシュは検知し、シングルスラッシュに置き換えます。
strip_path パラメータ
strip_path は、Kong の path に関する挙動を切り替えるブーリアン型のパラメータです。デフォルトは true になっています。true の場合、path の一部が route とマッチングすれば、アップストリームリクエスト URL からマッチングした route.path を取り除きます。false の場合は何も起きません。
true:path の一部が route とマッチングすればリクエスト URL からプレフィックス削除
false:path は何も操作されません
strip_path パラメータの変更方法
既に route が設定されている場合、パラメータの値を更新するには PATCH メソッドで更新します。
$ curl -i -X PATCH http://localhost:8001/services/testService/ro utes/testRoute –data ‘path_handling=v0’ –data ‘strip_path=false’
参考ドキュメント
v0 での動作例
strip_path=true の場合(デフォルト)
service.path – /service
route.path – /route
request path – /route/contents
strip_path – true
kong で proxy した path – /service/contents
strip_path=false の場合
service.path – /service
route.path – /route
request path – /route/contents
strip_path – false
kong で proxy した path – /service/route/contents
v1 での動作例
strip_path=true の場合(デフォルト)
service.path – /service
route.path – /route
request path – /route/contents
strip_path – true
kong で proxy した path – /service/contents
strip_path=false の場合
service.path – /service
route.path – /route
request path – /route/contents
strip_path – false
kong で proxy した path – /serviceroute/contents