rewrite
对请求进行内部重写。重写会改变请求URI的部分或全部内容。请注意,URI不包括方案或授权(主机和端口),而且客户通常不发送片段。因此,这个指令主要用于路径和查询字符串的处理。
重写会改变请求URI的部分或全部内容。请注意,URI不包含scheme或authority(主机和端口),而且客户端通常不会发送fragment。因此,此指令主要用于路径和查询字符串操作。
rewrite指令表示接受该请求,但要进行修改。
它与同一块中的其他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} }