intercept
对来自 reverse_proxy 指令 的 响应拦截 功能的通用抽象。此指令可与任何会产生响应的处理器一起使用,包括来自诸如 FrankenPHP 的 php_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.*}原始响应的头部。
示例
在使用 FrankenPHP 的 php_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
}