searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Openresty中的重定向与内部子请求

2023-07-17 08:18:44
41
0

一、内部重定向 ngx.exec

语法  ngx.exec(uri, args?)

示例 

--args参数可以以string的形式给出
ngx.exec("/test1", "test=tjh&value=hello%20world")

--也可以以lua table的形式给出
ngx.exec("/test1", { test= tjh, value= "hello world" })

-- ngx.exec 支持命名 location,但是 args 参数将会被忽略,不过可以通过 uri 传递
--下面的示例中 t=goodbye不会传出,实际请求命令的参数能传出
location /test1 {
     content_by_lua_block {
         return ngx.exec("@sub_test", "t=goodbye");
     }
 }

 location @sub_test{
     content_by_lua_block {
         local args = ngx.req.get_uri_args()
         for key, val in pairs(args) do
             if key == "t" then
                 ngx.say(val)
             end
         end
     }
 }

注意

1、该方法不会主动返回,在调用该方法时,需要显式加上return

2、重定向前必须没有任何输出,也就是必须在 ngx.send_headers 或者是 ngx.print、ngx.say之前调用

3、该方式不会产生额外的网络流量

 

二、外部重定向 ngx.redirect

语法 ngx.redirect(uri, status?)

示例 

-- status支持的状态码有:301、302(默认)、303、307、308
-- 以下两种写法等价
return ngx.redirect("/foo")
return ngx.redirect("/foo", ngx.HTTP_MOVED_TEMPORARILY)

-- 可以指定参数
return ngx.redirect('/foo?a=3&b=4')

-- 该重定向类似于 ngx_http_rewrite_module 里,rewrite 指令配合 redirect 修饰符。以下两种写法等同
rewrite ^ /foo? redirect;  #nginx 配置
return ngx.redirect('/foo');   -- Lua code

注意

1、该方法不会主动返回,在调用该方法时,需要显式加上return

2、重定向前必须没有任何输出,也就是必须在 ngx.send_headers 或者是 ngx.print、ngx.say之前调用

 

三、子请求 ngx.location.capture

语法 res = ngx.location.capture(uri, options?)

res是一个表格,包含以下4个成员:

res.status 子请求响应的状态码

res.header 表格的形式存放子请求的响应头,如果有同名多个响应头,那么值也为表格

res.body 存放响应体内容,必须通过检查 

res.truncated 返回值来确认响应体是否完整,如果为 true,那么证明响应体被裁剪过了不完整,可能是由于一些错误导致的。

示例

--POST请求
res = ngx.location.capture(
     '/foo/bar',
     { method = ngx.HTTP_POST, 
       body = 'hello, world'
        }
 )

注意

1、子请求默认情况下会继承所有父请求的请求头

2、对于子请求和父请求的参数,可以根据需要选择对应的属性

copy_all_vars复制父请求的参数给子请求,子请求对参数的更改不影响父请求的参数

share_all_vars 在父请求和子请求间共享参数

 

0条评论
0 / 1000
滕****涵
4文章数
0粉丝数
滕****涵
4 文章 | 0 粉丝
滕****涵
4文章数
0粉丝数
滕****涵
4 文章 | 0 粉丝
原创

Openresty中的重定向与内部子请求

2023-07-17 08:18:44
41
0

一、内部重定向 ngx.exec

语法  ngx.exec(uri, args?)

示例 

--args参数可以以string的形式给出
ngx.exec("/test1", "test=tjh&value=hello%20world")

--也可以以lua table的形式给出
ngx.exec("/test1", { test= tjh, value= "hello world" })

-- ngx.exec 支持命名 location,但是 args 参数将会被忽略,不过可以通过 uri 传递
--下面的示例中 t=goodbye不会传出,实际请求命令的参数能传出
location /test1 {
     content_by_lua_block {
         return ngx.exec("@sub_test", "t=goodbye");
     }
 }

 location @sub_test{
     content_by_lua_block {
         local args = ngx.req.get_uri_args()
         for key, val in pairs(args) do
             if key == "t" then
                 ngx.say(val)
             end
         end
     }
 }

注意

1、该方法不会主动返回,在调用该方法时,需要显式加上return

2、重定向前必须没有任何输出,也就是必须在 ngx.send_headers 或者是 ngx.print、ngx.say之前调用

3、该方式不会产生额外的网络流量

 

二、外部重定向 ngx.redirect

语法 ngx.redirect(uri, status?)

示例 

-- status支持的状态码有:301、302(默认)、303、307、308
-- 以下两种写法等价
return ngx.redirect("/foo")
return ngx.redirect("/foo", ngx.HTTP_MOVED_TEMPORARILY)

-- 可以指定参数
return ngx.redirect('/foo?a=3&b=4')

-- 该重定向类似于 ngx_http_rewrite_module 里,rewrite 指令配合 redirect 修饰符。以下两种写法等同
rewrite ^ /foo? redirect;  #nginx 配置
return ngx.redirect('/foo');   -- Lua code

注意

1、该方法不会主动返回,在调用该方法时,需要显式加上return

2、重定向前必须没有任何输出,也就是必须在 ngx.send_headers 或者是 ngx.print、ngx.say之前调用

 

三、子请求 ngx.location.capture

语法 res = ngx.location.capture(uri, options?)

res是一个表格,包含以下4个成员:

res.status 子请求响应的状态码

res.header 表格的形式存放子请求的响应头,如果有同名多个响应头,那么值也为表格

res.body 存放响应体内容,必须通过检查 

res.truncated 返回值来确认响应体是否完整,如果为 true,那么证明响应体被裁剪过了不完整,可能是由于一些错误导致的。

示例

--POST请求
res = ngx.location.capture(
     '/foo/bar',
     { method = ngx.HTTP_POST, 
       body = 'hello, world'
        }
 )

注意

1、子请求默认情况下会继承所有父请求的请求头

2、对于子请求和父请求的参数,可以根据需要选择对应的属性

copy_all_vars复制父请求的参数给子请求,子请求对参数的更改不影响父请求的参数

share_all_vars 在父请求和子请求间共享参数

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0