intercept
对 reverse_proxy
指令 的响应拦截功能进行通用抽象。该指令可用于任何产生响应的处理器,包括像 FrankenPHP 的 php_server
这样的插件。
此指令允许你匹配响应,第一个匹配的 handle_response
路由或 replace_status
会被调用。当被调用时,原始响应体会被暂存,给该路由机会写入不同的响应体、状态码或进行必要的响应头操作。如果路由未写入新的响应体,则会写回原始响应体。
语法
intercept [<matcher>] {
@name {
status <code...>
header <field> [<value>]
}
replace_status [<matcher>] <code>
handle_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
}