Hello!
2012/12/12 Eyas Guo:
> 如果在location /foo1里面设置下变量,如
> location /foo1 {
> set $foo "f1";
> }
>
> 请求/foo1返回"/foo1 ngx.var.foo value=[f1]"
> 请求/foo2返回"/foo3 ngx.var.foo value=[]",同时在error.log里面有报错"using uninitialized
> "foo" variable"
>
> 这个很奇怪呀,为何会报"using uninitialized "foo" variable",求解,感谢
>
因为此时 location /foo1 中通过 set 配置指令定义的变量 $foo 拥有一个 ngx_rewrite
模块提供的"取处理程序"(get handler),会在 $foo 变量未初始化就被读取时被自动调用,并打印出那一行 [warn]
级别的错误消息:“using uninitialized "foo" variable”.
由于 $foo 变量虽然创建于 location /foo1,但它的作用域却是全局的,即对 location /foo2
也可见。所以你在访问 location /foo2 时,$foo 变量确实没有初始化,于是在你在 access_by_lua 中通过
ngx.var.foo 访问该变量时,ngx_rewrite 模块的 get handler 就自动打印出那一行警告。
事实上,这个警告是可以通过配置关闭掉的,即在 location /foo2 或者更上层的作用域里加上一行:
uninitialized_variable_warn off;
就不会再有此警告了。关于此配置指令的更多细节请参见
http://wiki.nginx.org/HttpRewriteModule#uninitialized_variable_warn
关于 Nginx 变量的更多细节,可以参见我的 Nginx 连载教程:
http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html
Best regards,
-agentzh