rewrite
在內部重新編寫請求 URI。
rewrite 會變更部分或全部的請求 URI。請注意,URI 不包含 scheme 或 authority(host 和 port),而且用戶端通常不會傳送 fragments。因此,此指令主要用於 路徑 和 查詢 字串操作。
rewrite
指令表示接受請求的意圖,但會進行修改。
它與同一個區塊中的其他 rewrite
指令互斥,因此可以安全地定義否則會彼此串聯的 rewrite,因為只會執行第一個匹配的 rewrite。
在 rewrite
之前匹配請求的請求匹配器,可能在 rewrite
之後無法匹配相同的請求。如果您希望您的 rewrite
與其他處理程序共用路由,請使用 route
或 handle
指令。
語法
rewrite [<matcher>] <to>
- <to> 是要將請求重新編寫至的 URI。只會對 URI 中在 rewrite 中指定的組件(路徑或查詢字串)進行操作。URI 路徑是
?
之前的任何子字串。如果省略?
,則整個 token 會被視為路徑。
在 v2.8.0 之前,如果 <to>
參數以 /
開頭,則解析器可能會將其與匹配器 token 混淆,因此有必要指定萬用字元匹配器 token (*
)。
類似的指令
還有其他指令也會執行 rewrite,但表示不同的意圖,或是在不完全替換 URI 的情況下執行 rewrite
範例
將所有請求重新編寫至 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}
}