文件
一個 專案

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> 是替換字串(僅在 replacepath_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_pathhandle 相同,但它會在執行處理常式之前從請求中刪除前置詞。在許多情況下,可以用它取代 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,} /