在 2012年12月13日星期四UTC+8上午3时25分53秒,agentzh写道:
> Hello!
>
> 2012/12/12 赵旭海 wrote:
> > 这里想向您请教两个nginx lua的问题。
> > 最近老板让我在nginx中用lua实现一个小功能,就是接收浏览器传来的变量,然后通过content_by_lua_file在lua脚本中根据get的变量查询redis服务器,将查到的结果封装成json并返回。
> > 现在基本完成,但遇到了两个问题,一个就是get传参,如果参数中没有下划线_,
> > 那么能够通过$arg_name方式获取,但如果变量是goods_id之类的带下划线的时候,我试过,通过$arg_goods_id就获取不到goods_id这个变量了,请问还有什么办法获取吗?
>
> 你能提供一个最小化的反映此问题的用例吗?我如你所述,在本地尝试了下面这个用例,显然是可以正确工作的:
>
> location = /t {
> content_by_lua '
> ngx.say("goods_id: ", ngx.var.arg_goods_id)
> ';
> }
>
> 请求之:
>
> $ curl localhost:8080/t?goods_id=1234
> goods_id: 1234
>
> 显然是可以获取到的。
>
> 当然,ngx_lua 还提供了专用的用于获取 URL 参数的接口(相比 ngx.var.arg_XXX 更为高效一些),即
> ngx.req.get_uri_args:
>
> http://wiki.nginx.org/HttpLuaModule#ngx.req.get_uri_args
>
> > 还有一个就是返回结果中含有汉字,但老板让把返回的json中汉字转化为unicode编码,非汉字部分还是utf-8。从redis中取出的数据中汉字部分其实就是unicode的,但是用cjson这个库转化之后就编程汉字了
>
> lua-cjson 并不会自动把非 ASCII 的 UTF-8 字符转换为 unicode 转义序列。你需要
>
> 1. 自行修改 lua-cjson 或者发邮件给 lua-cjson 的作者请求实现;或者
> 2. 换用其他的支持 unicode 转义序列的 lua json 库。
>
> 同时抄送给 openresty 中文邮件列表:https://groups.google.com/group/openresty
> 也欢迎你加入此列表并在那里和我们交流这样的问题。
>
> Best regards,
> -agentzh
这里使用带有下划线的参数无法获取的缘故
估计是因为传递过来的URL是encode过的
下划线被encode成了%5F了
like this: object_name=collect ---> object%5Fname=collect
我自己处理的笨办法就是 事先 ngx.var.args = ngx.unescape_uri(ngx.var.args)
然后挨个通过ngx.var.arg_name 获取参数