文档
一个 项目

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
}