handle
在与其他位于相同嵌套级别的 handle 区块互斥的情况下评估一组指令。
换句话说,当多个 handle 指令连续出现时,只会评估第一个匹配的 handle 区块。没有匹配器的 handle 会充当回退路由。
handle 指令会根据其匹配器按照 directive sorting algorithm 进行排序。handle_path 指令是一个特殊情况,它与带有路径匹配器的 handle 在相同优先级进行排序。
如果需要,handle 区块可以嵌套。handle 区块内部只能使用 HTTP 处理器指令。
Syntax
handle [<matcher>] {
<directives...>
}
- <directives...> 是 HTTP 处理器指令或指令区块的列表,每行一个,就像在 handle 区块外部使用时一样。
Similar directives
还有其他可以包裹 HTTP 处理器指令的指令,但每种指令的用途取决于你希望表达的行为:
-
handle_path的作用与handle相同,但它会在运行其处理器之前从请求中剥离一个前缀。 -
handle_errors类似于handle,但仅在 Caddy 在请求处理期间遇到错误时调用。 -
route像handle一样包裹其他指令,但有两个不同点:- route 区块彼此之间不是互斥的,
- route 内的指令不会被重新排序,如有需要这可以让你拥有更多控制权。
Examples
在 /foo/ 使用静态文件服务器处理请求,其他请求使用反向代理:
example.com {
handle /foo/* {
file_server
}
handle {
reverse_proxy 127.0.0.1:8080
}
}
你可以在同一站点中混合使用 handle 和 handle_path,它们仍然彼此互斥:
example.com {
handle_path /foo/* {
# 请求路径会去掉 "/foo" 前缀
}
handle /bar/* {
# 路径仍然保留 "/bar"
}
}
你可以嵌套 handle 区块以创建更复杂的路由逻辑:
example.com {
handle /foo* {
handle /foo/bar* {
# 此区块仅匹配 /foo/bar 下的路径
}
handle {
# 此区块匹配 /foo/ 下的其余所有内容
}
}
handle {
# 此区块匹配其余所有请求(作为回退)
}
}