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