v2中文文档
项目

intercept

这是从 reverse_proxy 指令响应拦截功能抽象出来的通用形式。它可以与任何会产生响应的处理器一起使用,包括来自插件的处理器,例如 FrankenPHPphp_server

此指令允许你匹配响应,并调用第一个匹配的 handle_response 路由或 replace_status。调用时,原始响应体会被暂缓写出,从而让该路由有机会写出不同的响应体、新的状态码,或执行必要的响应头操作。如果该路由没有写出新的响应体,则会改为写出原始响应体。

语法

intercept [<matcher>] {
	@name {
		status <code...>
		header <field> [<value>]
	}

	replace_status [<response_matcher>] <code>

	handle_response [<response_matcher>] {
		<directives...>
	}
}
  • @name 是一个命名的响应匹配器块。只要每个响应匹配器都有唯一名称,就可以定义多个匹配器。响应可以按状态码以及响应头是否存在或其值进行匹配。

  • replace_status 会在给定匹配器匹配响应时,直接更改响应状态码。

  • handle_response 定义原始响应被给定响应匹配器匹配时要执行的路由。如果省略匹配器,则拦截所有响应。定义多个 handle_response 块时,将应用第一个匹配的块。在该块内部,可以使用所有其他指令

handle_response 路由中,可以使用以下占位符从原始响应中提取信息:

  • {resp.status_code} 原始响应的状态码。

  • {resp.header.*} 原始响应的响应头。

示例

使用 FrankenPHPphp_server 时,可以用 intercept 实现 X-Accel-Redirect 支持,按 PHP 应用的请求提供静态文件:

localhost {
	root /srv

	intercept {
		@accel header X-Accel-Redirect *
		handle_response @accel {
			root /path/to/private/files
			rewrite {resp.header.X-Accel-Redirect}
			method GET
			file_server
		}
	}

	php_server
}