Nginx服务器中使用lua获取get或post参数

使用ngx_lua模块(http://wiki.nginx.org/HttpLuaModule):

local request_method = ngx.var.request_method

local args = nil

local param = nil

local param2 = nil

--获取参数的值

if "GET" == request_method then

args = ngx.req.get_uri_args()

elseif "POST" == request_method then

ngx.req.read_body()

args = ngx.req.get_post_args()

end

param = args["param"]

param2 = args["param2"]

升级版(能处理content-type=multipart/form-data的表单):

local function explode ( _str,seperator )

local pos, arr = 0, {}

for st, sp in function() return string.find( _str, seperator, pos, true ) end do

table.insert( arr, string.sub( _str, pos, st-1 ) )

pos = sp + 1

end

table.insert( arr, string.sub( _str, pos ) )

return arr

end

local args = {}

local file_args = {}

local is_have_file_param = false

local function init_form_args()

local receive_headers = ngx.req.get_headers()

local request_method = ngx.var.request_method

if "GET" == request_method then

args = ngx.req.get_uri_args()

elseif "POST" == request_method then

ngx.req.read_body()

if string.sub(receive_headers["content-type"],1,20) == "multipart/form-data;" then--判断是否是multipart/form-data类型的表单

is_have_file_param = true

content_type = receive_headers["content-type"]

body_data = ngx.req.get_body_data()--body_data可是符合http协议的请求体,不是普通的字符串

--请求体的size大于nginx配置里的client_body_buffer_size,则会导致请求体被缓冲到磁盘临时文件里,client_body_buffer_size默认是8k或者16k

if not body_data then

local datafile = ngx.req.get_body_file()

if not datafile then

error_code = 1

error_msg = "no request body found"

else

local fh, err = io.open(datafile, "r")

if not fh then

error_code = 2

error_msg = "failed to open " .. tostring(datafile) .. "for reading: " .. tostring(err)

else

fh:seek("set")

body_data = fh:read("*a")

fh:close()

if body_data == "" then

error_code = 3

error_msg = "request body is empty"

end

end

end

end

local new_body_data = {}

--确保取到请求体的数据

if not error_code then

local boundary = "--" .. string.sub(receive_headers["content-type"],31)

local body_data_table = explode(tostring(body_data),boundary)

local first_string = table.remove(body_data_table,1)

local last_string = table.remove(body_data_table)

for i,v in ipairs(body_data_table) do

local start_pos,end_pos,capture,capture2 = string.find(v,'Content%-Disposition: form%-data; name="(.+)"; filename="(.*)"')

if not start_pos then--普通参数

local t = explode(v,"rnrn")

local temp_param_name = string.sub(t[1],41,-2)

local temp_param_value = string.sub(t[2],1,-3)

args[temp_param_name] = temp_param_value

else--文件类型的参数,capture是参数名称,capture2是文件名

file_args[capture] = capture2

table.insert(new_body_data,v)

end

end

table.insert(new_body_data,1,first_string)

table.insert(new_body_data,last_string)

--去掉app_key,app_secret等几个参数,把业务级别的参数传给内部的API

body_data = table.concat(new_body_data,boundary)--body_data可是符合http协议的请求体,不是普通的字符串

end

else

args = ngx.req.get_post_args()

end

end

end

(0)

相关推荐

  • Nginx服务器中403 forbidden的错误如何解决

    nginx 的 403 Forbidden errors 表示你在请求一个资源文件但是nginx不允许你查看。 403 Forbidden 只是一个HTTP状态码,像404,200一样不是技术上的错误 ...

  • nginx做负载CDN加速获取端真实ip

    nginx做负载CDN加速获取端真实ip 在不用cdn的情况下,nginx做负载获取真实ip时,nginx配置如下: Java代码 proxy_set_header Host $host; proxy ...

  • Nginx服务器部署SSL证书

    SSL证书也称为服务器证书,是遵守全球统一的严格身份认证的SSL协议的一种数字证书,由全球信任的证书颁发机构(CA)验证服务器身份后颁发.将SSL证书安装在网站服务器上,可实现网站身份验证和数据加密传 ...

  • nginx服务器的安装和配置的方法介绍

    nginx服务器的安装和配置 1.安装 1)在windows环境下的安装 下载windows版本的nginx后,解压,然后进入到目录中,运行:start nginx 其他命令:nginx -s [ s ...

  • ubuntu下的nginx服务器如何配置

    ubuntu 下的nginx服务器配置详解 1.nginx服务器的安装 sudo apt-get install nginx 2.nginx服务器的启动 sudo /etc/init.d/nginx ...

  • 在DHCP服务器中新建作用域

    下面介绍在Windows Server 2012的DHCP服务器中创建作用域的具体操作. 操作方法 01 打开服务器管理器,选择"工具">"DHCP"选项 ...

  • 远程检测Linux服务器中内存占用情况的方法

    我们要用的监控内存的脚本在Nagios 市场上,在创建者的Github仓库中也可以找到. 假设我们已经安装了NRPE,我们首先在我们想要监控的服务器上下载脚本. 准备远程服务器 在 Debain/Ub ...

  • 在excel表格中使用vba获取窗口的尺寸

    今天为大家分享excel中使用vba来获取窗口的尺寸方法,推荐到我们,有需要的朋友可以参考本文! 步骤 1.首先我们打开一个工作样表作为例子. 2.使用alt+f11组合快捷键进入vbe编辑器,插入一 ...

  • Foxmail7.2怎么删除网页邮箱服务器中的邮件?

    问题前提:邮箱容量限制为4G,对于邮件多的朋友,两三天就满了,可是又不想删除原来的邮件,那么最方便的方法只能借助邮件客户端来实现了. 1.最近有朋友问我说,怎么在foxmail中实现删除网页邮箱服务器 ...