uri🔗
操作请求的 URI。它可以剥离路径前缀/后缀或替换整个 URI 上的子字符串。
此指令与 rewrite
的不同之处在于 uri
可区分地 更改 URI,而不是像 rewrite
那样将其重置为完全不同的内容。虽然 rewrite
被特殊对待为内部重定向,但 uri
只是另一个中间件。
语法🔗
支持多种不同的操作
uri [<matcher>] strip_prefix <target>
uri [<matcher>] strip_suffix <target>
uri [<matcher>] replace <target> <replacement> [<limit>]
uri [<matcher>] path_regexp <target> <replacement>
uri [<matcher>] query [-|+]<param> [<value>]
uri [<matcher>] query {
<param> [<value>] [<replacement>]
...
}
第一个(非匹配器)参数指定操作
-
strip_prefix 从路径中剥离前缀。
-
strip_suffix 从路径中剥离后缀。
-
replace 对整个 URI 执行子字符串替换。
-
<target> 是前缀、后缀或搜索字符串/正则表达式。如果是前缀,则可以省略前导正斜杠,因为路径总是以正斜杠开头。
-
<replacement> 是替换字符串。支持使用捕获组,语法为
$name
或${name}
,或使用数字表示索引,例如$1
。有关详细信息,请参阅 Go 文档。如果替换值为""
,则从值中删除匹配的文本。 -
<limit> 是对最大替换次数的可选限制。
-
-
path_regexp 对 URI 路径部分执行正则表达式替换。
-
<target> 是前缀、后缀或搜索字符串/正则表达式。如果是前缀,则可以省略前导正斜杠,因为路径总是以正斜杠开头。
-
<replacement> 是替换字符串。支持使用捕获组,语法为
$name
或${name}
,或使用数字表示索引,例如$1
。有关详细信息,请参阅 Go 文档。如果替换值为""
,则从值中删除匹配的文本。
-
-
query 对 URI 查询执行操作,模式取决于参数名称的前缀或参数的计数。可以使用块一次指定多个操作,并按以下顺序分组和执行:rename 🡒 set 🡒 append 🡒 replace 🡒 delete。
-
如果没有前缀,则使用查询中给定的值设置参数。
例如,
uri query foo bar
将foo
参数的值设置为bar
。 -
以
-
为前缀可从查询中删除参数。例如,
uri query -foo
将从查询中删除foo
参数。 -
以
+
为前缀可将参数附加到查询,并带有给定的值。这将不会覆盖具有相同名称的现有参数(省略+
以覆盖)。例如,
uri query +foo bar
将foo=bar
附加到查询。 -
带有
>
作为中缀的参数会将参数重命名为>
之后的值。例如,
uri query foo>bar
会将foo
参数重命名为bar
。 -
使用三个参数时,执行查询值正则表达式替换,其中第一个参数是查询参数名称,第二个参数是搜索值,第三个参数是替换值。第一个参数(参数名称)可以是
*
,以对所有查询参数执行替换。支持使用捕获组,语法为
$name
或${name}
,或使用数字表示索引,例如$1
。有关详细信息,请参阅 Go 文档。如果替换值为""
,则从值中删除匹配的文本。例如,
uri query foo ^(ba)r $1z
将替换foo
参数的值,其中该值以bar
开头,导致该值变为baz
。
-
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
来消除额外的配置行。
示例🔗
从所有请求路径的开头剥离 /api
uri strip_prefix /api
从所有请求路径的末尾剥离 .php
uri strip_suffix .php
在任何请求 URI 中将 "/docs/" 替换为 "/v1/docs/"
uri replace /docs/ /v1/docs/
将请求路径(但不包括请求查询)中所有重复的斜杠折叠为单个斜杠
uri path_regexp /{2,} /
将 foo
查询参数的值设置为 bar
uri query foo bar
从查询中删除 foo
参数
uri query -foo
将 foo
查询参数重命名为 bar
uri query foo>bar
将 bar
参数附加到查询
uri query +foo bar
将 foo
查询参数的值替换为 baz
,其中该值以 bar
开头
uri query foo ^(ba)r $1z
一次执行多个查询操作
uri query {
+foo bar
-baz
qux test
renamethis>renamed
}