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 }