rewrite
在内部重写请求 URI。
rewrite 会更改部分或全部请求 URI。请注意,URI 不包括 scheme 或 authority(主机和端口),并且客户端通常不发送片段。因此,此指令主要用于路径和查询字符串操作。
rewrite 指令暗示接受请求的意图,但会进行修改。
它与同一代码块中的其他 rewrite 指令互斥,因此可以安全地定义原本会相互级联的 rewrite,因为只会执行第一个匹配的 rewrite。
在 rewrite 之前匹配请求的请求匹配器可能在 rewrite 之后无法匹配相同的请求。如果您希望您的 rewrite 与其他处理程序共享路由,请使用 route 或 handle 指令。
语法
rewrite [<matcher>] <to>
- <to> 是要将请求重写到的 URI。仅将对 rewrite 中指定的 URI 组件(路径或查询字符串)进行操作。URI 路径是
?之前的任何子字符串。如果省略?,则整个标记都被视为路径。
在 v2.8.0 之前,如果 <to> 参数以 / 开头,解析器可能会将其与 匹配器标记 混淆,因此必须指定通配符匹配器标记 (*)。
类似指令
还有其他指令也执行 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}
}