一、通过url获取
1、通过分析url中的规则获取(类似于分析请求路由)
其实是通过在ngx中分析url,将url中的代表特殊含义的部分设置一个自定义是变量中,再通过ngx.var.变量名获取
例如:新闻的详情页面,可能是http://localhost:8000/detail/12345.html
这个12345可能代表的是新闻的ID,那么:
nginx配置中可以这么写:
location /detail/([a-zA-Z0-9-_]+) {
default_type text/html;
set $news_id $1;
content_by_lua_file /data/www/orproject/news.lua
}
在lua文件(news.lua)中可以这么获取:
local news_id = ngx.var.news_id
ngx.say(news_id)
ngx.say(ngx.var.uri)
当然我们也可以通过分析当前uri(ngx.var.uri)来分析出news_id,不过通过本方法更加便利
2、通过分析url中的查询字符串获取
所谓查询字符串就是url中?后面的那一段,通过这些方式可以在url中传参
(1)通过nginx中的预定义变量获取
在nginx中通过arg_NAME可以获取参数名为NAME的值,如/news/detail?id=122,那么我们可以通过arg_id来获取这个参数id的值
在openresty中通过ngx.var.arg_NAME即可获取参数名为NAME的值,如ngx.var.arg_id
(2)通过API中的ngx.req.get_uri_args()
这将获取一个参数的table,如:
local args = ngx.req.get_uri_args()
ngx.say(args.id)
二、通过请求数据获取
1、获取GET请求参数:ngx.req.get_uri_args()
如一个uri:http://localhost:8000/var?username=shixinke&uid=1000
local args = ngx.req.get_uri_args()
ngx.say(args.username)
ngx.say(args["username"])
ngx.say(args.uid)
ngx.say(args["uid"])
2、获取POST请求参数
(1)ngx.req.get_body_data()
得到的是一个字符串
如:
请求一个url:http://localhost:8000/post
请求参数为: name = shixinke, id = 10000
通过CURL来模拟:
curl -d "id=10000&name=shixinke" http://localhost:8000/post
nginx配置:
location /post {
default_type text/html;
content_by_lua_file $web_root/api/post.lua;
}
lua代码:
ngx.req.read_body()
local str = ngx.req.get_body_data()
ngx.say("str:"..str);
输出:str:id=10000&name=shixinke
(2)ngx.req.get_post_args()
得到的是一个table
还是使用上面的例子:
lua代码:
ngx.req.read_body()
local data = ngx.req.get_post_args()
for key, value in pairs(data) do
ngx.say("key="..key..";value="..value..";")
end
输出:
key=name;value=shixinke;
key=id;value=10000;
注:在获取post请求的参数前,需要使用ngx.req.read_body()表示读取请求体内容(post请求中,请求参数在请求体中)