ドキュメント
プロジェクト

uri

リクエストのURIを操作します。パスのプレフィックス/サフィックスを削除したり、URI全体で部分文字列を置換したりできます。

このディレクティブは、rewriteとは異なり、urirewriteのように完全に異なるものにリセットするのではなく、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,} /