nginx LUA使用总结


声明:本文转载自https://my.oschina.net/u/778875/blog/1619175,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

    很多中间件都会用到lua。mysqlproxy,redis,nginx, lua 一高性能著称。使用脚本可以大大扩展服务器的功能。Nginx不会天然支持lua. 需要先安装nginx的模块lua-nginx-module-0.10.8 。

    我有一个应用是用到nginx下载文件。在下载之前会判断用户请求是否合法。如果只是判断URI地址。仅仅使用nginx的if else 就够了。但是如果要判断请求的参数做业务判断。比如我要拿到用户传过来的参数去 调另外一个接口校验,成功则下载。

rewrite_by_lua  '    resp=ngx.location.capture("/auth"); ';

这个auth 是我的一个子请求。

location =/auth         {                   proxy_pass  http://host/api/auth            proxy_pass_request_body off;            proxy_set_header N-Original-URI $request_uri;            proxy_set_header Accept-Encoding '';         } 

这里需要设置一个头部 proxy_set_header Accept-Encoding ''。否则请求接口返回的数据可能是gzip压缩过的。还要设置N-Original-URI因为接口需要通过N-Original-URI 拿到源地址。

 

首先我必须的判断请求接口成功与否。

 if( res.status ~=200  ) then                 ngx.exit(res.status);             end;

如果响应的状态码不是200就直接终止本次请求,也不执行下面的lua。执行ngx.exit()的时候把具体错误作为参数传给它。用户在页面上就可以看到错误类型。

然后我必须的校验返回的结果是否是合法的,是否符合基本的正则表达式。不能让乱七八糟的返回结果向下执行。

local  mbody,merror=ngx,re.match(res.body,"([0-9a-zA-Z]+/)*[0-9a-zA-Z]+"); if(mbody)    ngx.var.userkey=mbody[0] else    ngx.log(ngx.ERR,"auth chech fail"..(res.body));    ngx.exit(ngx.HTTP_FORBIDDEN); end; 

校验返回的结果是否是 单词/单词的形式。lua本身%w可以表示单词,但是我在这里写%w好像不通过。

如果校验失败就打印一个错误日志然后直接终止当前请求。如果成功拿到的变量userkey就可以做后面请求的地址拼接 proxy_pass http://host/${userkey};

本文发表于2018年02月07日 00:32
(c)注:本文转载自https://my.oschina.net/u/778875/blog/1619175,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1693 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1