ngx.location.capture 只支持相对路径,不能用绝对路径

17 篇文章 0 订阅

ngx.location.capture 是非阻塞的,ngx.location.capture也可以用来完成http请求,但是它只能请求到相对于当前nginx服务器的路径,不能使用之前的绝对路径进行访问,但是我们可以配合nginx upstream实现我们想要的功能。

在nginx.cong中的http部分添加如下upstream配置

upstream backend {
    server s.taobao.com;
    keepalive 100;
}
在example.conf配置如下location

     location ~ /proxy/(.*) {
        internal;
        proxy_pass http://backend/$1$is_args$args;
     }

lua 请求可以这么写:

local resp = ngx.location.capture("/proxy/search", {
    method = ngx.HTTP_GET,
    args = {q = "hello"}

})
if not resp then
    ngx.say("request error :", err)
    return
end
ngx.log(ngx.ERR, tostring(resp.status))

--获取状态码
ngx.status = resp.status

--获取响应头
for k, v in pairs(resp.header) do
    if k ~= "Transfer-Encoding" and k ~= "Connection" then
        ngx.header[k] = v
    end
end
--响应体
if resp.body then
    ngx.say(resp.body)
end

是的,你是对的。我之前给出的示例中使用的ngx.location.capture函数只能用于发起内部请求。如果你想要发起外部请求,可以考虑使用ngx.http模块中的函数,比如ngx.http.request。 下面是一个使用ngx.http.request发起异步请求并解析返回值的示例代码: ```lua -- 定义一个异步请求处理函数 local function async_request() local http = require("resty.http") local httpc = http.new() -- 发起异步请求 local res, err = httpc:request_uri("http://api.example.com/endpoint", { method = ngx.HTTP_GET, headers = { ["Content-Type"] = "application/json", }, }) -- 在这里处理返回的响应结果 if res then ngx.log(ngx.INFO, "Async request response: ", res.body) else ngx.log(ngx.ERR, "Async request failed: ", err) end -- 关闭HTTP连接 httpc:close() end -- 创建一个新的协程来发起异步请求 local co = ngx.thread.spawn(async_request) -- 在这里可以执行其他的操作 -- 等待协程完成 ngx.thread.wait(co) ``` 在以上示例中,我们使用了resty.http模块来创建一个HTTP客户端,并使用该客户端的request_uri函数发起异步请求。然后,我们在处理返回结果时进行了相应的处理。最后,我们使用ngx.thread.spawn创建了一个新的协程来执行异步请求函数,并使用ngx.thread.wait等待协程完成。 请注意,为了使用resty.http模块,你需要在Nginx配置中安装并启用OpenResty。 希望这次能满足你的需求!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值