文件
一個 專案

rewrite

在內部重新編寫請求 URI。

rewrite 會變更部分或全部的請求 URI。請注意,URI 不包含 scheme 或 authority(host 和 port),而且用戶端通常不會傳送 fragments。因此,此指令主要用於 路徑查詢 字串操作。

rewrite 指令表示接受請求的意圖,但會進行修改。

它與同一個區塊中的其他 rewrite 指令互斥,因此可以安全地定義否則會彼此串聯的 rewrite,因為只會執行第一個匹配的 rewrite。

rewrite 之前匹配請求的請求匹配器,可能在 rewrite 之後無法匹配相同的請求。如果您希望您的 rewrite 與其他處理程序共用路由,請使用 routehandle 指令。

語法

rewrite [<matcher>] <to>
  • <to> 是要將請求重新編寫至的 URI。只會對 URI 中在 rewrite 中指定的組件(路徑或查詢字串)進行操作。URI 路徑是 ? 之前的任何子字串。如果省略 ?,則整個 token 會被視為路徑。

在 v2.8.0 之前,如果 <to> 參數以 / 開頭,則解析器可能會將其與匹配器 token 混淆,因此有必要指定萬用字元匹配器 token (*)。

類似的指令

還有其他指令也會執行 rewrite,但表示不同的意圖,或是在不完全替換 URI 的情況下執行 rewrite

  • uri 操作 URI(去除前綴、後綴或子字串替換)。

  • try_files 根據檔案是否存在來重新編寫請求。

範例

將所有請求重新編寫至 index.html,保持任何查詢字串不變

example.com {
	rewrite * /index.html
}

/api 作為所有請求的前綴,保留 URI 的其餘部分,然後反向代理到應用程式

api.example.com {
	rewrite * /api{uri}
	reverse_proxy localhost:8080
}

將 API 請求上的查詢字串替換為 a=b,保持路徑不變

example.com {
	rewrite * ?a=b
}

對於僅限於 /api/ 的請求,保留現有的查詢字串並新增一個鍵值對

example.com {
	rewrite /api/* ?{query}&a=b
}

同時變更路徑和查詢字串,保留原始查詢字串,同時將原始路徑新增為 p 參數

example.com {
	rewrite * /index.php?{query}&p={path}
}