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