[nginx]lua读取请求体
前言
nginx默认不读取请求体的数据,但可以通过$request_body内置变量来获取。$request_body存在内存中,如果它的字节大小超过nginx配置的client_body_buffer_size的值,nginx就会把请求体存放到临时文件中。此时数据就不在内存中了,这会导致$request_body为空。
同步非阻塞方式获取请求体
ngx.req.read_body
含义:同步读取客户端请求体,且不会阻塞nginx的事件循环。使用此指令后,就可以通过ngx.req.get_body_data来获取请求体的数据了。但如果使用临时文件来存放请求体,就需要先使用函数ngx.req.get_body_file来获取临时文件名,再读取临时文件中的请求体数据。
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*
ngx.req.get_body_data
含义:执行ngx.req.read_body指令后,可以使用本指令在内存中获取请求体数据,结果会返回一个lua的字符串类型的数据。如果要获取table类型的数据,则需要使用ngx.req.get_post_args。
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*、log_by_lua*
ngx.req.get_post_args
含义:读取包含当前请求在内的所有post请求的查询参数,返回一个table类型的数据
环境:rewrite_by_lua*、access_by_lua*、content_by_lua*、log_by_lua*、header_filter_by_lua*、body_filter_by_lua*
ngx.req.get_body_file
含义:获取存放请求体的临时文件名。如果请求体被存放在内存中,获取的值就是nil。
示例
获取string类型的请求体
location /testlua {
client_max_body_size 10k;
client_body_buffer_size 1k;
content_by_lua_block {
local ngx = require "ngx";
ngx.req.read_body() -- 开启读取请求体模式
local data = ngx.req.get_body_data() -- 获取内存中的请求体
if data then
ngx.print(string.format("data: %s, type: %s",data,type(data)))
return
else
local file = ngx.req.get_body_file() -- 如果内存中没有, 则到临时文件中读取
if file then
ngx.say("body is in file ", file)
else
ngx.say("no body found")
end
end
}
}
请求测试
curl -i http://192.168.1.111/testlua -d 'test=123&a=qwe&b=zxc'
HTTP/1.1 200 OK
Server: openresty
Date: Sun, 28 May 2023 10:05:51 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive
data: test=123&a=qwe&b=zxc, type: string
获取table类型的请求体
location /testlua {
client_max_body_size 10k;
client_body_buffer_size 1k;
content_by_lua_block {
local ngx = require "ngx";
ngx.req.read_body() -- 开启读取请求体模式
local args, err = ngx.req.get_post_args() -- 获取内存中的请求体
if args then
for k,v in pairs(args) do
if type(v) == "table" then
ngx.say(k, ": ", table.concat(v, ", "))
else
ngx.say(k, ": ", v)
end
end
else
local file = ngx.req.get_body_file() -- 如果内存中没有, 则到临时文件中读取
if file then
ngx.say("body is in file ", file)
else
ngx.say("no body found")
end
end
}
}
请求测试
curl -i http://192.168.1.111/testlua -d 'test=123&a=qwe&b=zxc'
HTTP/1.1 200 OK
Server: openresty
Date: Sun, 28 May 2023 10:37:48 GMT
Content-Type: application/octet-stream
Transfer-Encoding: chunked
Connection: keep-alive
a: qwe
b: zxc
test: 123
参考
- 《Nginx实战:基于lua语言的配置、开发与架构详解》
[nginx]lua读取请求体的更多相关文章
- nginx读取请求体
请求体的读取一般发生在nginx的content handler中,一些nginx内置的模块,比如proxy模块,fastcgi模块,uwsgi模块等,这些模块的行为必须将客户端过来的请求体(如果有的 ...
- nginx请求体读取
上节说到nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外 ...
- 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- post请求体过大导致ngx.req.get_post_args()取不到参数体的问题
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size 该地址对于client_body_buf ...
- Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...
- openresty(nginx+lua)初识
1.新增项目配置文件: vim /usr/example/example1.conf --将以下内容加入example1.conf server { listen 80; server_name _; ...
- http 请求体数据--ngx
HTTP包体的长度有可能非常大,不同业务可能对包体读取 处理不相同, 比如waf, 也许会读取body内容或者只是读取很少的前几十字节.所以根据不同业务特性,对http body 数据包处理方式不同, ...
- 从Excel获取请求体
Excel文件 .py文件---------------------- import xlrdimport re def fetch_body(path,sheet,name,adict): ...
- Spring Cloud Gateway 之获取请求体(Request Body)的几种方式
Spring Cloud Gateway 获取请求体 一.直接在全局拦截器中获取,伪代码如下 private String resolveBodyFromRequest(ServerHttpReque ...
- Asp.Net Core上传大文件请求体限制设置
IIS进程内部署时 1. Web.Config的<system.webServer>节点下增加 <security> <requestFiltering> < ...
随机推荐
- 武装你的WEBAPI-OData与DTO
前面写了很多有关OData使用的文章,很多读者会有疑问,直接将实体对象暴露给最终用户会不会有风险?$expand在默认配置的情况下,数据会不会有泄露风险? 答案是肯定的,由于OData的特性,提供给我 ...
- Linux系统下CUDA和cuDNN环境配置
本人配置环境:linux服务器,ubantu18,显卡驱动11.0,安装CUDA11.0和cuDNN8.2.1. 一.安装CUDA11.0 1.先多找几篇博客,了解大概的流程,避免踩坑. 2.官网下载 ...
- 【由浅入深学MySQL】- MySQL连接查询详解
本系列为:MySQL数据库详解,为千锋教育资深Java教学老师独家创作 致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解.如果感觉对大家有帮助的话,可以[点个关注]持续追更~ ...
- 2022-02-07:k8s安装mysql,yaml如何写?(非面试题)
2022-02-07:k8s安装mysql,yaml如何写?(非面试题) 答案2022-02-07: yaml如下: apiVersion: apps/v1 kind: Deployment meta ...
- 2021-05-07:给定一个数组arr,你可以在每个数字之前决定+或者-,但是必须所有数字都参与 ,再给定一个数target,请问最后算出target的方法数是多少?
2021-05-07:给定一个数组arr,你可以在每个数字之前决定+或者-,但是必须所有数字都参与 ,再给定一个数target,请问最后算出target的方法数是多少? 福大大 答案2021-05-0 ...
- 有关ODOO的ORM操作
1.查询操作 sale_id = self.env['sale.order'].search([]) env将对象实例化,search进行搜索,可以根据需求添加搜索条件 search_count([] ...
- ODOO13之六:Odoo 13开发之模型 – 结构化应用数据
在本系列文章第三篇Odoo 13 开发之创建第一个 Odoo 应用中,我们概览了创建 Odoo 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...
- 完成第一个 Vue3.2 项目后,使用体会
第一次Composition API 在vue3.2中,正式支持了script setup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法.在vue ...
- 【python爬虫实战】用python爬取爱奇艺电视剧十大榜单的全部数据!
目录 一.爬取目标 二.讲解代码 三.查看结果 四.视频演示 五.附完整源码 一.爬取目标 本次爬取的目标是,爱奇艺电视剧类目下的10个榜单:电视剧风云榜-爱奇艺风云榜 可以看到,这10个榜单包含 ...
- 2022 i春秋冬季赛
Misc nan's analysis 下载附件之后,打开是一道流量数据包. 开始分析流量,首先看到的是FTP流量 追踪tcp,发现ftp账号密码 先记录一下,接下来发现一个zip文件,选择原始数据, ...