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>
-
第一个(非匹配器)参数指定操作
-
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 中将 "/docs/" 替换为 "/v1/docs/"
uri replace /docs/ /v1/docs/
将请求路径(但不包括请求查询)中的所有重复斜杠折叠为单个斜杠
uri path_regexp /{2,} /