微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ngx_Lua模块中的重定向

Nginx中实现重定向可以通过rewrite指令,具体可参考《Nginx学习——http_rewrite_module的rewrite指令

 

通过Lua模块也可以实现同样的功能,Lua模块提供了相关的API来实现重定向功能,主要有:

 

>ngx.exec

 

语法:ngx.exec(uri,args?)

主要实现的是内部的重定向,等价于下面的rewrite指令

rewrite regrex replacement last;

 

例子:

ngx.exec('/some-location');
ngx.exec('/some-location','a=3&b=5&c=6');
ngx.exec('/some-location?a=3&b=5','c=6');

 

注意:

1. 如果给定的uri是命名的location,那么args就会被自动忽略的,如下所示:

location /foo {
    content_by_lua ' ngx.exec("@bar"); ';
}
 
location @bar {
    ...
}

 

2. args参数可以以string的形式给出,也可以以lua table的形式给出,如下所示:

ngx.exec("/foo","a=3&b=hello%20world")

ngx.exec("/foo",{ a= 3,b="hello world"})

 

3. 该方法不会主动返回,因此,强烈建议在调用方法时,最好显示加上return,如下所示:

return ngx.exec(...)

 

4. 该方法不像ngx.redirect方法,不会产生额外的网络流量。

 

>ngx.redirect

 

语法:ngx.redirect(uri,status?)

方法会给客户端返回一个301/302重定向,具体是301还是302取决于设定的status值,如果不指定status值,认是返回302 (ngx.HTTP_MOVED_TEMPORARILY),其等价于下面的rewrite指令:

rewrite ^ /foo? permanent;# Nginx config

 

如果返回301,那么等价于下面的rewrite指令:

rewrite ^ /foo? redirect;# Nginx config

 

要注意与ngx.location.capture*的区别

ngx.location.capture*主要是通过子请求的方式实现location的重新定位的,它与上面的两种方法完全不同的。

Subrequests are completely different from HTTP 301/302 redirection (viangx.redirect) and internal redirection (viangx.exec).

 

> ngx.req.set_uri

 

语法: ngx.req.set_uri(uri,jump?)

 

通过参数uri重写当前请求的uri;参数jump,表明是否进行locations的重新匹配。当jump为true时,调用ngx.req.set_uri后,Nginx将会根据修改后的uri,重新匹配新的locations;如果jump为false,将不会进行locations的重新匹配,而仅仅是修改了当前请求的URI而已。jump的认值为false。

 

jump为true,等价于rewrite...last

jump为false,等价于rewrite...break

 

例如:

ngx.req.set_uri("/foo",true)

等价于

rewrite ^ /foo last;

 

rewrite ^ /foo break;

等价于

ngx.req.set_uri("/foo",false)  或 ngx.req.set_uri("/foo")

 

(全文完)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐