文档
一个 项目

handle

互斥地评估一组指令,与其他相同嵌套级别的 handle 块互斥。

换句话说,当多个 handle 指令按顺序出现时,只有第一个_匹配_的 handle 块会被评估。没有匹配器的 handle 就像一个_后备_路由。

handle 指令根据指令排序算法按其匹配器排序。handle_path 指令是一个特例,它与带有路径匹配器的 handle 具有相同的优先级。

如果需要,可以嵌套 handle 块。只有 HTTP 处理器指令可以在 handle 块内使用。

语法

handle [<matcher>] {
	<directives...>
}
  • <directives...> 是 HTTP 处理器指令或指令块的列表,每行一个,就像在 handle 块外部使用一样。

类似指令

还有其他可以包装 HTTP 处理器指令的指令,但每个指令都有其用途,取决于您想要表达的行为:

  • handle_pathhandle 相同,但在运行其处理器之前会从请求中剥离前缀。

  • handle_errors 类似于 handle,但仅在 Caddy 在请求处理期间遇到错误时才会调用。

  • routehandle 一样包装其他指令,但有两个区别:

    1. route 块彼此之间不是互斥的,
    2. route 内的指令不会重新排序,如果需要,可以给您更多控制权。

示例

使用静态文件服务器处理 /foo/ 中的请求,使用反向代理处理其他请求:

example.com {
	handle /foo/* {
		file_server
	}

	handle {
		reverse_proxy 127.0.0.1:8080
	}
}

您可以在同一站点中混合使用 handlehandle_path,它们仍然会彼此互斥:

example.com {
	handle_path /foo/* {
		# 路径已剥离 "/foo" 前缀
	}

	handle /bar/* {
		# 路径仍保留 "/bar"
	}
}

您可以嵌套 handle 块以创建更复杂的路由逻辑:

example.com {
	handle /foo* {
		handle /foo/bar* {
			# 此块仅匹配 /foo/bar 下的路径
		}

		handle {
			# 此块匹配 /foo/ 下的所有其他内容
		}
	}

	handle {
		# 此块匹配所有其他内容(作为后备)
	}
}