对于Nginx踩坑记(一),在openresty的google group上提了个问题:ngx.exec是如何处理上层定义的变量的

春哥的回复摘录如下:

你这里使用了 rewrite 配置指令来发起内部跳转。其实 rewrite 指令发起的内部跳转非常特殊:它不会从
server-rewrite 阶段重新开始运行,而是从 find-config 阶段开始执行,所以你上例中写在server {}
块中的“set $hello hello”并不会在跳转后重新运行一遍,因为 server-rewrite 阶段在跳转后被直接跳过。

注意,rewrite 配置指令的特殊行为也可以通过下面这一行 ngx_lua 配置来复现:

 rewrite_by_lua 'ngx.req.set_uri("/test2", true)'; 

而ngx.exec() 调用(以及其他接口,比如 echo_exec 配置指令)发起的内部跳转的标准行为是从 server-rewrite
阶段重新开始执行,所以你的“set $hello hello”会被重新执行一遍,从而改写掉 $hello 变量原先的取值(即”bye”)。

我或许应该在教程里强调一下这个重要细节 :)