связь между операторами перезаписи uri и установки переменных в 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).*)(/?)$ $1  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).*)(/?)$ $1  break;
      set $location_name offer;
}

В журналах отладки nginx я вижу, что заданная переменная выполняется в рабочем случае, но не в нерабочем. Я искал в документации nginx, есть ли какая-либо связь - лучшее, что я могу получить, это то, что оба они выполняются на этапе перезаписи, но никакой другой информации о причине такого поведения.

Любая идея, почему это происходит?


person palash kulshreshtha    schedule 29.10.2020    source источник


Ответы (1)


Из документации:

перемена

прекращает обработку текущего набора директив ngx_http_rewrite_module, как с директивой break;

Обе директивы rewrite и set реализованы директивой ngx_http_rewrite_module.

Операторы вычисляются последовательно внутри блока location. break (либо сам по себе, либо часть rewrite...break) прекратит обработку в текущем контексте. Таким образом, любые директивы set, следующие за ним, будут игнорироваться.

person Richard Smith    schedule 29.10.2020
comment
будет ли какой-либо другой флаг, такой как last/permanant и т. д., решать случай, когда на директиву set не влияет порядок операторов? Я ищу то же самое в документах. - person palash kulshreshtha; 29.10.2020
comment
Добавление любого флага к оператору rewrite остановит обработку последующих операторов перезаписи модуля в текущем контексте. Вы пробовали не добавлять флаг? - person Richard Smith; 29.10.2020