Re: переменные $1

Alexey ngnx8810773a83 на avksrv.org
Ср Апр 22 23:00:27 UTC 2020


День добрый.

23.04.2020 0:35, Slawa Olhovchenkov пишет:
> On Thu, Apr 23, 2020 at 12:03:16AM +0300, Maxim Dounin wrote:
>
>>>> Ну да, одно из возможных решений - отучить регулярные выражения в
>>>> map'е трогать $1..$N.  С другой стороны - конфигурации вида
>>>>
>>>>      map $uri $foo {
>>>>          ~(.+) $1;
>>>>      }
>>>>
>>>> тоже никто не отменял.
>>> не понимаю возражения.
>>> я как раз о том, что внури map $1..$N локальные и не портят $1..$N в
>>> других местах. очевидно же, что вот этот $1 _вне_ map никому не нужен.
>>> $foo сформировался и никому ничего больше от этого map не требуется.
>> Тут есть два нюанса:
>>
>> 1. Механизм формирования $1..$N - общий, и если map не трогает
>> $1..$N - то конструкция выше работать не будет.  А делать так,
>> чтобы $1..$N использовали результат выполнения конкретного
>> регулярного выражения, а не просто последнего - логично как раз в
>> рамках rewrite'а, где это конкретное регулярное выражение
>> очевидно.  (Ну то есть в рамках map'а следом тоже встанет вопрос,
>> когда в правой части будет $bar$1, где $bar - ещё один map с
>> регулярным выражением.  Но это, очевидно, надо будет решать так
>> же.)
>>
>> 2. Вообще говоря, побочные эффекты от регулярных выражений в map'е
>> быть должны, те же именованные captures - вполне логично
>> использовать и много кто использует на практике.  Использовать
>> побочные эффекты в виде $1..$N - с моей точки зрения странно, но
>> теоретически и это вполне может быть.
> я понимаю откуда взялось.
> что не отменяет гемороя.
>
>>>>>> https://trac.nginx.org/nginx/ticket/564
>>>>>>
>>>>>> Patches are welcome.
>>>>> 6 лет...
>>>> Да, за 6 лет никто не сподобился даже попытаться прислать патч.
>>>> Что как бы позволяет предложить, что - не жмёт.
>>> или никто не может разобраться.
>> Это не "или", это именно что "не жмёт".  Затраты на попытаться
>> разобраться - превышают количество проблем, которые создаёт
>> текущее поведение.
> ну хоть бы в документацию большими буквами.
> я не получил большого гемороя только из-за того что в процессе у меня
> и так полный дебаг был включен по другому поводу и я сразу увидел
> такой фифект.


А что, кроме лени, мешает не пользоваться $1$2$3 вообще, а использовать

1. поименованные переменные (?<uniqvar>...)

$uniqvar

2. везде, где переменные не нужны или не использовать скобки, а если не 
возможно или не удобно, использовать  отказ от создания переменной (?:...) ?

и тогда точно будем знать что


map $... {

   ~^start(?<mapvar>)end$  '1';

}


location /(?<locvar>.+)/$ {

   rewrite ^(?:.+)$ /$mapvar/$locvar/? break;

приведет к тому, что хочется.


нет ?

/А




Подробная информация о списке рассылки nginx-ru