一、内部重定向 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 在父请求和子请求间共享参数