nginx中rewrite uri和set variable语句的关系

relation between rewrite uri and set variable statements in nginx

我试图找出 nginx 位置块中的重写语句与位置块中的设置变量语句之间的关系。为什么我问是因为以下 2 种情况下的不同行为

什么不起作用-获取 http 500,因为 url 未设置-设置是在重写语句之后*

location ~ ^/offer/ {
      log_by_lua_file lua/datadog/api_latency.lua;
      proxy_pass $url;
      proxy_read_timeout 60;
      rewrite ^((?U).*)(/?)$   break;
      set $location_name offer;
      set $url https://example.com;
}

有效方法 - 当设置在重写语句之前时

location ~ ^/offer/ {
      log_by_lua_file lua/datadog/api_latency.lua;
      proxy_pass $url;
      proxy_read_timeout 60;
      set $url https://example.com;
      rewrite ^((?U).*)(/?)$   break;
      set $location_name offer;
}

在 nginx 调试日志中,我可以看到 set 变量在工作情况下被执行,但在非工作情况下没有。我在 nginx 文档中搜索了是否存在任何关系 - 我能得到的最好的是这两个都是在重写阶段执行的,但没有关于此行为原因的其他信息。

知道为什么会这样吗?

来自the documentation

break

stops processing the current set of ngx_http_rewrite_module directives as with the break directive;

rewriteset 指令均由 ngx_http_rewrite_module 实现。

语句在 location 块中按顺序求值。 break(单独或 rewrite...break 的一部分)将在当前上下文中停止处理。所以它后面的任何 set 指令都将被忽略。