处理一个请求的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>
- 第一个(非匹配器)参数指定操作。
- 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,以消除额外的一行配置。
示例
将/api从所有请求路径的开头剥离:
uri strip_prefix /api
从所有请求路径的结尾去除.php:
uri strip_suffix .php
在任何请求URI中用"/v1/docs/"替换"/docs/":
uri replace /docs/ /v1/docs/
将请求路径中所有重复的斜线(但不是请求查询)折叠成一个斜线:
uri path_regexp /{2,} /