Kong の path ハンドリングアルゴリズムについて

3 min 1,178 views

記事の概要と対象者

本記事は、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’

参考ドキュメント

https://docs.konghq.com/gateway-oss/2.4.x/admin-api/#path-handling-algorithms

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

関連記事