赞,哥们真仔细,以前没发觉这个情况
想想,应该说明 ngx.exec 和 rewrite 发起的 ”内部跳转“ 应该是不一样的
写在 location 外层的 set 会在 server-rewrite 阶段执行
rewrite 只是改变当前的 uri,然后将当前请求的处理阶段倒退回了 find-config,所以 外层的 set 不会被第二次执行
ngx.exec 应该是会到 server-rewrite 或者之前,再一次执行了 set,所以会变成 “hello”
去掉location 外层的set,验证一下,貌似有理
再看文档,echo_exec 和 ngx.exec 都是通过 ngx_http_internal_redirect 来实现
再看源码: src/http/ngx_http_core_module.c,ngx_http_internal_redirect 确实是会重新在执行一次 ngx_http_handler
初步判断, ngx.exec 比 rewrite 会回滚到更早,到 server-rewrite 阶段
简单分析,不一定准确,还请春哥,其他朋友补充指正~~