lua模块的安装详见:https://www.jianshu.com/p/077208fc838c
1 Lua基本语法-变量的定义
以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 W3c 与 w3c 是两个不同的标示符。
关键字不允许做变量名称
关键字
2 Lua基本语法-数据类型
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
数据类型
我们可以使用type函数测试给定变量或者值的类型:
print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
变量
变量在使用前,必须在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语
句变量开辟存储区,用于存储变量的值。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
函数外的变量默认为全局变量,除非用 local 显示声明。函数内变量与函数的参数默认为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。
变量的默认值均为 nil。
a = 5 -- 全局变量
local b = 5 -- 局部变量
function joke()
c = 5 -- 全局变量
local d = 6 -- 局部变量
end
joke()
print(c,d) --> 5 nil
do
local a = 6 -- 局部变量
b = 6 -- 全局变量
print(a,b); --> 6 6
end
print(a,b) --> 5 6
循环语法:
while
Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。
Lua 编程语言中 while 循环语法:
while(condition)
do
statements
end
使用如下:
a=10
while( a < 20 )
do
print("a 的值为:", a)
a = a+1
end
for循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类::
数值for循环
泛型for循环
数值for循环:Lua 编程语言中数值for循环语法格式:
for var=exp1,exp2,exp3 do
<执行体>
end
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。
# 10 8 6 4 2 0
for i=10,0,-2 do
print(i)
end
# 1 a 2 b 3 b
arr = {"a","b","c"}
for i,v in ipairs(arr) do
#key
print(i)
#value
print(v)
end
泛型for循环:泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。
--打印数组a的所有值
for i,v in ipairs(a)
do print(v)
end
i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do
print(v)
end
输出结果:
流程控制
Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true 和非nil为真。
要注意的是Lua中 0 为 true:
--[ 0 为true ]
if(0)
then
print("0 为真")
end
3 nginx使用lua脚本
1.缓存
语法:lua_code_cache on | off
含义:指定是否开启lua的代码编译缓存,开发时可以设置为 off,以便lua文件实时生效,如果是生产线上,为了性能,建议开启。
2.路径
语法:lua_package_path
含义:设置 lua 代码的寻找目录。
3.ngx.var.VAR_NAME
语法:ngx.var.VAR_NAME
含义:读写Nginx的变量值。例如HTTP请求头、Nginx set的变量、URL参数,甚至Nginx通过正则表达式捕获的2等值(获取方式是ngx.var[1]、ngx.var[2],依此类推)。
案例:
server
{
listen 8080;
server_name www.blog131.com;
root /www/blog;
index index.html index.htm;
location /lus {
default_type text/html;
set $a '';
set $b '';
set $c '';
#引入函数库
#arg_test 是test参数
rewrite_by_lua_block {
local ngx = require "ngx";
ngx.var.a = 1;
ngx.var.b = ngx.var.http_user_agent;
ngx.var.c = ngx.var.arg_test;
}
echo $a;
echo $b;
echo $c;
}
}
test
请求头
4.Ngx.req.set_header()
语法:Ngx.req.set_header(header_name,header_value)
含义:添加或修改当前HTTP的请求头,如果请求头已经存在,则会被替换成新的值。通过此方式设置的请求头会被继承到子请求中。
5.Ngx.req.get_headers()
语法:ngx.req.get_headers()
含义:获取当前请求的全部请求头,并返回一个Lua的table类型的数据。
6.ngx.req.clear_header()
语法:ngx.req.clear_header(header_name)
含义:清除当前请求中指定的请求头。清除后,如果存在未执行的子请求,则子请求会继承清除后的请求头。
location /lus_header {
default_type text/html;
#引入函数库
rewrite_by_lua_block {
local ngx = require "ngx";
ngx.req.set_header("Test",{"1","2"});
local header_ngx = ngx.req.get_headers();
ngx.say(header_ngx["Test"]);
ngx.print(header_ngx["Test"]);
}
}
image.png
响应头
7.ngx.resp.get_headers
语法:ngx.resp.get_headers()
含义:读取当前请求的响应头,并返回一个Lua的table类型的数据。
8.ngx.header.HEADER = VALUE
语法:value = ngx.header.HEADER
含义:对响应头进行修改、清除、添加等操作。
如果需要清除一个响应头,将它赋值为nil即可,如下所示:
Ngx.header[“X-Test”] = nil
location /lus_resp {
default_type text/html;
#引入函数库
content_by_lua_block {
local ngx = require "ngx";
ngx.header.test = {"1","2"};
local header_ngx = ngx.resp.get_headers();
ngx.say(header_ngx["Test"]);
}
}
image.png
9.set_by_lua
语法:set_by_lua $res <lua-script-str> [$arg1 $arg2 ...]
含义:是为了能够让nginx的变量与lua的变量相互作用赋值。
案例(注意引号):
location /lus_set {
default_type text/html;
set $diff '';
set_by_lua $sum '
local ngx = require "ngx"
local a = 32
local b = 56
ngx.var.diff = a - b
return a + b';
echo "sum = $sum, diff = $diff";
}
image.png
10.content_by_lua
语法:content_by_lua <lua-script-str>
含义:可以由lua直接确定nginx响应页面的正文
案例:
content_by_lua “ngx.print(ngx.var[‘arg_a’])”
11.rewrite_by_lua
语法:rewrite_by_lua <lua-script-str>
含义:这个指令更多的是为了替代HttpRewriteModule的rewrite指令来使用的,优先级低于rewrite指令
案例 (重定向):
location /lus_rewrite {
set $a 12;
set $b '';
rewrite_by_lua '
ngx.var.b = tonumber(ngx.var.a) + 1
if tonumber(ngx.var.b) == 13 then
return ngx.redirect("/bar");
end
';
echo "res = $b";
}
网友评论