春哥关于 Nginx 踩坑记(一)的回复
对于 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“)。我或许应该在教程里强调一下这个重要细节 :)