核心:只介绍'与http相关'的,辅助'场景'理解
"nginx api for lua":指的就是在'nginx.conf文件'中用'*_by_lua' 和'*_by_lua_file'指令使用lua代码,为lua提供的专门的api
① 获取url的查询字符串
1)差异
++++++++++++"共同点"++++++++++++
ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri 中的'查询字符串参数'
备注:get_uri_args,'get请求'传递的'查询字符串'
++++++++++++"差异点"++++++++++++
1) 当请求uri中有多个'同名参数'时,ngx.var.arg_xx的做法是取'第一个'出现值
2) ngx.req_get_uri_args["xx"]的做法是返回一个table,该table里存放了该参数的'所有值'
2) 案例
1) $query_string、 $arg_PARAMETER、 $http_NAME -->"特殊" ,其它的是'nginx的变量'
2) nginx '正则组捕获变量' $1, $2, $3 等等,也可以通过编写 ngx.var[1], ngx.var[2], ngx.var[3] 等来读取此接口
3) 设置 ngx.var.Foo 为 nil 值将会'删除' $Foo Nginx 变量:
ngx.var.args = nil
3)测试
4)ngx.var[index]索引
② 其它方法
print() # 与 ngx.print()方法有区别,print()相当于ngx.log()
ngx.ctx # 这是一个lua的table,用于保存ngx上下文的变量,在整个请求的生命周期内都有效
ngx.location.capture() # 发出'一个子请求'
ngx.location.capture_multi() # 发出多个子请求
ngx.status # 读或者写当前请求的相应状态,必须在输出相应头'之前'被调用 -->"响应码"
ngx.header.HEADER # 访问或设置http header头信息
ngx.req.set_uri() # 设置当前请求的URI
ngx.set_uri_args(args) # 根据args参数'重新定义'当前请求的URI参数.
ngx.req.get_uri_args() # 返回一个LUA TABLE,包含当前请求的'全部的URL参数'
ngx.req.get_post_args() # 返回一个LUA TABLE,包括所有当前请求的'POST参数' -->"请求体"
ngx.req.get_headers() # 返回一个"包含当前请求头"信息的lua table.
ngx.req.set_header() # 设置当前请求头header某字段值,当前请求的子请求不会受到影响.
ngx.req.read_body() # 在'不阻塞'ngnix其他事件的情况下同步读取客户端的body信息.
ngx.req.discard_body() # 明确'丢弃'客户端请求的body
ngx.req.get_body_data() # 以字符串的形式获得客户端的请求body内容
ngx.req.get_body_file() # 当发送文件请求的时候,获得文件的名字 -->"重点"
ngx.req.set_body_data() # 设置客户端请求的BODY
ngx.req.set_body_file() # 通过filename来指定当前请求的file data
ngx.req.clear_header() # 清求某个请求头
ngx.exec(uri,args) # 执行内部跳转,根据uri和请求参数
ngx.redirect(uri, status) # 执行301或者302的重定向
ngx.send_headers() # 发送指定的响应头 -->"重点"
ngx.headers_sent # 判断头部是否发送给客户端ngx.headers_sent=true
ngx.print(str) # 发送给客户端的响应页面
ngx.say() # 作用类似ngx.print,不过say方法输出后会"换行" -->"重要"
ngx.log(log.level,...) # 写入nginx日志 -->"重要!"
ngx.flush() # 将缓冲区内容输出到页面(刷新响应)
ngx.exit(http-status) # 结束请求并输出状态码
ngx.eof() # 明确指定关闭结束输出流
ngx.escape_uri() # URI编码(本函数对逗号,不编码,而php的urlencode会编码)
ngx.unescape_uri() # uri解码
ngx.encode_args(table) # 将tabel解析成url参数
ngx.decode_args(uri) # 将参数字符串编码为一个table
ngx.encode_base64(str) # BASE64编码
ngx.decode_base64(str) # BASE64解码
ngx.crc32_short(str) # 字符串的crs32_short哈希
ngx.crc32_long(str) # 字符串的crs32_long哈希
ngx.hmac_sha1(str) # 字符串的hmac_sha1哈希
ngx.md5(str) # 返回16进制MD5
ngx.md5_bin(str) # 返回2进制MD5
ngx.today() # 返回当前日期yyyy-mm-dd
ngx.time() # 返回当前时间戳
ngx.now() # 返回当前时间
ngx.update_time() # 刷新后返回
ngx.localtime() # 返回 yyyy-mm-dd hh:ii:ss
ngx.utctime() # 返回yyyy-mm-dd hh:ii:ss格式的utc时间
ngx.cookie_time(sec) # 返回用于COOKIE使用的时间
ngx.http_time(sec) # 返回可用于http header使用的时间
ngx.parse_http_time(str) # 解析HTTP头的时间
ngx.is_subrequest # 是否子请求(值为 true or false)
ngx.re.match(subject,regex,options,ctx) # ngx正则表达式匹配,详细参考官网
ngx.re.gmatch(subject,regex,opt) # 全局正则匹配
ngx.re.sub(sub,reg,opt) # 匹配和替换(未知)
ngx.re.gsub() # 未知
③ ngx.config
ngx.config.ngx_lua_version # 当前ngx_lua模块版本号
ngx.config.nginx_version # nginx版本
ngx.worker.exiting # 当前worker进程是否正在关闭
ngx.worker.pid # 当前worker进程的PID
ngx.config.nginx_configure # 编译时的./configure命令选项
ngx.config.prefix # 编译时的prefix选项
④ 模拟执行时间
需求:计算'请求'的执行时间,'模拟'nginx中的 $request_time
ngx.update_time()
local request_time = ngx.now() - ngx.req.start_time()
⑤ 关于方法
⑥ HTTP方法
⑦ HTTP状态码
⑧ 日志级别