uri
リクエストのURIを操作します。パスのプレフィックス/サフィックスを削除したり、URI全体で部分文字列を置換したりできます。
このディレクティブは、rewrite
とは異なり、uri
はrewrite
のように完全に異なるものにリセットするのではなく、URIを明確に変更します。rewrite
は内部リダイレクトとして特別に扱われる一方、uri
は単なる別のミドルウェアです。
構文
複数の異なる操作がサポートされています
uri [<matcher>] strip_prefix <target>
uri [<matcher>] strip_suffix <target>
uri [<matcher>] replace <target> <replacement> [<limit>]
uri [<matcher>] path_regexp <target> <replacement>
-
最初(非マッチャー)の引数で操作を指定します
-
strip_prefix パスからプレフィックスを削除します。
-
strip_suffix パスからサフィックスを削除します。
-
replace URI全体で部分文字列の置換を実行します。
-
path_regexp URIのパス部分に対して正規表現置換を実行します。
-
-
<target> は、プレフィックス、サフィックス、または検索文字列/正規表現です。プレフィックスの場合、パスは常にスラッシュで始まるため、先頭のスラッシュは省略できます。
-
<replacement> は、置換文字列です(
replace
およびpath_regexp
でのみ有効)。$name
または${name}
構文、または$1
などのインデックスの数値を使用して、キャプチャグループを使用することをサポートします。詳細は、Goのドキュメントを参照してください。 -
<limit> は、置換の最大回数のオプションの制限です(
replace
でのみ有効)。
URIの変更は、URIの正規化またはエスケープ解除された形式で発生します。ただし、リクエストパスの該当位置にあるリテラルエスケープのみを一致させるために、プレフィックスまたはサフィックスパターンでエスケープシーケンスを使用できます。たとえば、uri strip_prefix /a/b
は/a/b/c
と/a%2Fb/c
の両方を/c
に書き換えます。また、uri strip_prefix /a%2Fb
は/a%2Fb/c
を/c
に書き換えますが、/a/b/c
とは一致しません。
URIパスは、変更前にディレクトリトラバーサルのドットがクリーンアップされます。さらに、<target>
にも複数のスラッシュが含まれていない限り、複数のスラッシュ(//
など)はマージされます。
類似のディレクティブ
他のいくつかのディレクティブもリクエストURIを操作できます。
-
rewrite
は、値を部分的に変更するのではなく、パスとクエリ全体を新しい値に変更します。 -
handle_path
は、handle
と同じ処理を行いますが、ハンドラーを実行する前にリクエストからプレフィックスを削除します。多くの場合、uri strip_prefix
の代わりに、構成の余分な1行を削減するために使用できます。
例
すべてのリクエストパスの先頭から/api
を削除します
uri strip_prefix /api
すべてのリクエストパスの末尾から.php
を削除します
uri strip_suffix .php
任意のリクエストURIで、"/docs/" を "/v1/docs/" に置換します
uri replace /docs/ /v1/docs/
リクエストパス(リクエストクエリではない)内の繰り返しのスラッシュをすべて単一のスラッシュに縮小します
uri path_regexp /{2,} /