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,} /