Nginx 子请求可以发起非阻塞的内部请求访问目标 location。目标 location 可以是配置文件中其他文件目录,或 任何 其他 nginx C 模块,包括
ngx_proxy
、ngx_fastcgi
、ngx_memc
、ngx_postgres
、ngx_drizzle
,甚至 ngx_lua 自身等等 。
子请求只是模拟 HTTP 接口的形式, 没有 额外的 HTTP/TCP 流量,也 没有 IPC (进程间通信) 调用
子请求与 HTTP 301/302 重定向指令 (通过 ngx.redirect) 完全不同,也与内部重定向 ((通过 ngx.exec) 完全不同。
示例
--返回一个包含四个元素的 Lua 表 (res.status, res.header, res.body, 和 res.truncated)。
--res.status (状态) 保存子请求的响应状态码。
res = ngx.location.capture(uri)
--URI 请求串可以与 URI 本身连在一起,例如:
res = ngx.location.capture('/page/search?a=3&b=4')
--发送一个 POST 子请求
ngx.location.capture('/search?a=1',
{ args = { b = 3, c = ':' } }
)
--等同于
ngx.location.capture('/foo?a=1&b=3&c=%3a')
通过 ngx.location.capture 创建的子请求默认继承当前请求的所有请求头信息。
例如,当使用标准的 ngx_proxy 模块服务子请求时,如果主请求头中包含 "Accept-Encoding: gzip",可能导致子请求返回 Lua 代码无法正确处理的 gzip 压缩过的结果。通过设置 proxy_pass_request_headers
为 off ,在子请求 location 中忽略原始请求头;或在子请求中设置 proxy_set_header
Accept-Encoding ""; 忽略 Accept-Encoding 头。
ngx.location.capture 和 ngx.location.capture_multi 指令无法抓取包含以下指令的 location: add_before_body
, add_after_body
, auth_request
, echo_location
, echo_location_async
, echo_subrequest
, 或 echo_subrequest_async
。