Openresty子请求详解及使用示例

openresty 2023-08-23 776次浏览

Nginx 子请求可以发起非阻塞的内部请求访问目标 location。目标 location 可以是配置文件中其他文件目录,或 任何 其他 nginx C 模块,包括 ngx_proxyngx_fastcgingx_memcngx_postgresngx_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

Openresty子请求详解及使用示例

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址