v2中文文档
项目

handle

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

换句话说,当多个handle指令连续出现时,只会评估第一个_匹配_的handle块。没有匹配器的handle会作为_后备_路由。

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

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

语法

handle [<matcher>] {
	<directives...>
}
  • <directives...> 是HTTP处理器指令或指令块的列表,每行一个,写法与在handle块外部使用时相同。

类似指令

还有其他一些指令也可以包装HTTP处理器指令,但每个指令都有自己的用途,取决于你想表达的行为:

  • handle_path的作用与handle相同,但它会在运行处理器之前从请求中剥离一个前缀。

  • 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 {
		# 此块匹配其他所有内容(作为后备)
	}
}